paint-brush
7 conceptos clave para poner a prueba tus habilidades en .NETpor@ssukhpinder
126 lecturas

7 conceptos clave para poner a prueba tus habilidades en .NET

por Sukhpinder Singh7m2024/09/30
Read on Terminal Reader

Demasiado Largo; Para Leer

Este artículo cubre conceptos críticos de C# para desarrolladores de .NET, incluidos IEnumerable vs. ICollection, inyección de dependencias, async/await, parámetros de referencia vs. parámetros de salida, manejo de excepciones y las diferencias entre tareas y subprocesos en programación concurrente. Proporciona ejemplos de código prácticos para probar y profundizar su comprensión.
featured image - 7 conceptos clave para poner a prueba tus habilidades en .NET
Sukhpinder Singh HackerNoon profile picture
0-item
1-item
2-item
3-item

¡Este artículo es perfecto para cualquiera que quiera demostrar su experiencia en .NET!


Hola desarrolladores .NET,


En este artículo, exploraré diferentes conceptos de C# que todo desarrollador debe conocer. Siempre es una buena idea poner a prueba tus conocimientos, por lo que he reunido algunos ejemplos en este artículo con explicaciones y ejemplos de código.


Si conoce y comprende los ejemplos de código, es probable que le vaya bastante bien en .NET.

1. Diferencia entre IEnumerable<T> y ICollection<T>

Al escribir lógica en C# , los desarrolladores se encuentran con frecuencia con IEnumerable<T> y ICollection<T>. Pueden parecer bastante similares, pero cumplen distintas funciones en el desarrollo de software.


  • IEnumerable<T> actúa como interfaz base para colecciones no genéricas. Ayuda a iterar sobre una colección de un tipo definido.


Es bueno tener una colección liviana que sea más segura, ya que no se permite la manipulación de datos. En cualquier colección, si desea evitar la manipulación de datos, se recomienda utilizar IEnumerable<T>

 IEnumerable<int> numbers = new List<int> { 1, 2, 3 }; foreach (var number in numbers) { Console.WriteLine(number); // Outputs: 1 2 3 }
  • ICollection<T> extiende IEnumerable<T> y permite realizar modificaciones con la ayuda de métodos de alteración. Esta interfaz consta de métodos para agregar, eliminar y verificar recuentos en la colección.


 ICollection<int> data = new List<int> { 12,43,556}; numbers.Add(4); Console.WriteLine(data.Count); // Outputs: 4

Se recomienda utilizar ICollection<T> cuando se requieren métodos de modificación para la colección y IEnumerable<T> para acciones de lectura simples.

2. El papel de la inyección de dependencia en .NET Core

Se recomienda utilizar un patrón de diseño DI cuando se desea escribir código acoplado de forma flexible y comprobable. Con DI, los desarrolladores pueden gestionar dependencias entre clases fácilmente.


.NET Core tiene soporte integrado para DI, lo que hace que sea fácil de implementar.


Cómo un desarrollador puede implementar DI en C#

  • Registra los servicios en el método ConfigureServices de tu archivo Startup.cs. Aquí es donde defines qué servicios estarán disponibles para la inyección.
 public void ConfigureServices(IServiceCollection services) { // Register a transient service services.AddTransient<IMyService, MyService>(); }


  • Inyecta servicios en tus clases mediante la inyección de constructores. Esto garantiza que tus clases reciban sus dependencias sin necesidad de crearlas directamente.
 public class MyController : Controller { private readonly IMyService _myService; public MyController(IMyService myService) { _myService = myService; } public IActionResult Index() { var data = _myService.GetData(); return View(data); } }

Un código es más fácil de mantener y probar cuando un desarrollador desacopla la creación de servicios.

3. La diferencia entre los parámetros de referencia y de salida

En C#, ref y out se utilizan para pasar parámetros por referencia, pero tienen características distintas.

  • Los parámetros de referencia requieren que la variable se inicialice antes de pasarla a un método. El método puede entonces modificar el valor de la variable.
 public void UpdateValue(ref int number) { number += 10; } int myNumber = 5; UpdateValue(ref myNumber); Console.WriteLine(myNumber); // Outputs: 15


  • Los parámetros de salida no requieren inicialización antes de ser transferidos. El método debe asignar un valor al parámetro de salida antes de que regrese.
 public void GetValues(out int value1, out int value2) { value1 = 10; value2 = 20; } GetValues(out int a, out int b); Console.WriteLine(a); // Outputs: 10 Console.WriteLine(b); // Outputs: 20

ref se utiliza normalmente cuando un método necesita modificar una variable existente, mientras que out se utiliza cuando un método necesita devolver múltiples valores o inicializar valores que no fueron proporcionados por el llamador.

4. Async y Await: cómo mejorar el rendimiento de las aplicaciones

En .NET, la programación asincrónica es esencial para escribir aplicaciones eficientes que funcionen bien bajo carga. Las palabras clave async y await simplifican el trabajo con operaciones asincrónicas.

  • Los métodos asincrónicos permiten realizar tareas de forma asincrónica. Marque un método con la palabra clave async para habilitar el uso de await dentro de él.
 public async Task<string> FetchDataAsync() { await Task.Delay(1000); // Simulates an asynchronous operation return "Data fetched"; }


  • await ayuda a la interfaz de usuario de la aplicación al no bloquear el hilo principal.
 public async Task ShowDataAsync() { string data = await FetchDataAsync(); Console.WriteLine(data); }

Si desea mejorar el rendimiento de su aplicación, utilice async y await de manera efectiva y al mismo tiempo manteniendo la interfaz de usuario de la aplicación activa.

5. Manejo de excepciones en aplicaciones .NET Core

Manejar excepciones con elegancia es crucial para mantener aplicaciones robustas y fáciles de usar. .NET Core proporciona varios mecanismos para el manejo de excepciones.

  • Manejo de excepciones locales: utilice bloques try-catch para capturar y manejar excepciones.
 try { int result = 10 / 0; // This will throw a DivideByZeroException } catch (DivideByZeroException ex) { Console.WriteLine("An error occurred: " + ex.Message); }


  • El manejo de excepciones globales en ASP.NET Core se puede gestionar mediante middleware. Capture todos los tipos de excepciones en un lugar común, lo que ayuda a los desarrolladores a gestionar mensajes de error comunes y fáciles de usar para los usuarios.
 public void Configure(IApplicationBuilder app) { app.UseExceptionHandler("/Home/Error"); }

El middleware de manejo de excepciones global proporciona un lugar común para manejar todos los errores y excepciones de la aplicación. Garantiza que la aplicación maneje las respuestas de manera consistente.

6. El rol de appsettings.json en ASP.NET Core

El archivo appsettings.json se utiliza para administrar las credenciales de la aplicación, como las cadenas de configuración y otras claves específicas de la aplicación. Los ajustes de configuración también se pueden dividir según los entornos.

  • Ejemplo de archivo appsettings.json:
 { "ConnectionStrings": { "DefaultConnection": "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;" }, "Logging": { "LogLevel": { "Default": "Warning" } } }


  • Acceder a los valores de configuración de su aplicación es sencillo utilizando el sistema de configuración integrado.
 public class MyService { private readonly string _connectionString; public MyService(IConfiguration configuration) { _connectionString = configuration.GetConnectionString("DefaultConnection"); } }

El archivo appsettings.json permite obtener fácilmente configuraciones que deben manejarse de manera eficiente.

7. Comprender la diferencia entre tarea y subproceso en C#

Tanto Task como Thread se utilizan para programación concurrente en C#, pero cumplen propósitos diferentes.

  • El subproceso representa una única ruta de ejecución y es una construcción de nivel inferior. Proporciona más control sobre la ejecución, pero requiere una gestión manual.
 Thread thread = new Thread(() => { Console.WriteLine("Running on a new thread"); }); thread.Start();


  • La tarea proporciona una funcionalidad abstracta para implementar operaciones asincrónicas y se utiliza junto con async/await.
 Task.Run(() => { Console.WriteLine("Running asynchronously"); });

Las tareas simplifican la gestión de operaciones asincrónicas y, a menudo, son la opción preferida para el desarrollo moderno de C#.


Entonces, ¿cómo te fue?

Si conoce el concepto con confianza y comprende los ejemplos de código, es probable que tenga un buen conocimiento de .NET.

Sigamos conversando y ayudémonos mutuamente a crecer como profesionales de .NET.


¡Feliz codificación!