Archivo por meses: noviembre 2015

Novedades en C# 6.0 (II)

En mi anterior entrada hacia un anticipo de las novedades que ofrece la nueva versión de C#. Todas las novedades, recaen en una evolución hacia la simplicidad y mejora de la escritura del propio lenguaje.

Operador condición NULL

¿Cuantas veces has visto en tu aplicación un NullReferenceException por no controlar correctamente un posible valor null? Seguramente en diferentes ocasiones. En esta nueva versión se nos propone una forma simple y limpia de hacer esta validación.
Observemos cómo hacíamos la validación hasta el momento,

public string Truncate(string value, int length)
{
  string result = value;
  if (value != null)
    result = value.Substring(0, Math.Min(value.Length, length));
  return result;
}

Si no hacemos la validación del value a null, el método Substring nos devolvería una excepción NullReferenceException. Vamos a hacer exactamente lo mismo, pero con la nueva sintaxis de código,

public string Truncate(string value, int length)
{          
  return value?.Substring(0, Math.Min(value.Length, length));
}

Cómo podemos observar, nos simplifica la validación y la expresa de forma natural para que nos sea más simple y ágil tener en cuenta este tipo de validaciones que tantos quebraderos de cabeza nos dan cuándo las olvidamos.
Debemos tener en cuenta que el operador ? va a devolver siempre un tipo nullable, es decir, que si el tipo de devolución es int deberemos expresar el tipo cómo int? para que pueda aceptar el valor después de la validación con el operador o bien un null.
De hecho, si no indicamos esto, el IDE no nos dejará compilar indicando que el error es de conversión de tipos int? a int.

Mejoras en al gestión de excepciones

Tenemos dos mejoras muy importantes, la primera de ellas es el uso de operaciones async/await dentro de los bloques de excepciones y la segunda es el filtrado de excepciones.

try
{
  WebRequest webRequest = WebRequest.Create("http://contoso.com");
  WebResponse response = await webRequest.GetResponseAsync();
}
catch (WebException exception)
{
  await WriteErrorToDb(exception);
}

De forma totalmente asíncrona escribiríamos la traza en en nuestro log y seguiremos ejecutando el código mejorando así el performance de nuestra aplicación. Haciendo uso del mismo bloque de código podemos, ahora, filtrar por el tipo de excepción y actuar en consecuencia. Veamos el ejemplo,

try
{
  WebRequest webRequest = WebRequest.Create("http://contoso.com");
  WebResponse response = await webRequest.GetResponseAsync();
}
catch (WebException exception)
 when (exception.Status == WebExceptionStatus.Timeout)
  {
     await SendEmail(exception);
  }

Inicialización de diccionarios

Esta característica nos permite inicializar con valores por defecto nuestros diccionarios con mucho menos código que antes,

Dictionary<string, string> airportCode = new Dictionary<string, string>()
{
["BCN"] = "Barcelona",
["LER"] = "Lleida",
["SVQ"] = "Sevilla"
};

Constructores primarios

Esta es una fantástica feature para nuestro código, aunque a mi personalmente, me gusta más tener los constructores correctamente ubicados en regiones dentro de mi clase aunque debo reconocer que ubicar el constructor a nivel de clase es práctico y nos da, de un solo vistazo, que información precisa la clase para funcionar debidamente.

public class BasketItem(int unit, int productId, double price)
{
public string Unit{ get; set; } = unit;
public string ProductId { get; set; } = productId;
public string Price { get; set; } = price;
}

Espero disfrutéis de estas novedades y sobretodo, que las apliquéis 😉 ¡vuestro código lo agradecerá!