Novedades en C# 6.0
C# 6.0, que se distribuye con Visual Studio 2015, incluye un compilador de nueva generación, completamente escrito en C#. Conocido como proyecto "Roslyn", el nuevo compilador expone todo el proceso de compilación mediante bibliotecas, lo que te permite realizar análisis de código en código fuente arbitrario. El propio compilador es de código abierto, y el código fuente está disponible en https://github.com/dotnet/roslyn.
Además, C# 6.0 presenta varias mejoras menores pero significativas, destinadas principalmente a reducir el desorden del código.
El operador nulo-condicional ("Elvis") (ver "Operadores nulos") evita tener que comprobar explícitamente si es nulo antes de llamar a un método o acceder a un miembro de un tipo. En el siguiente ejemplo, result
se evalúa como nulo en lugar de lanzar un NullReferenceException
:
System.Text.StringBuilder sb = null;
string result = sb?.ToString(); // result is null
Las funciones con cuerpo de expresión (véase "Métodos") permiten que los métodos, propiedades, operadores e indexadores que componen una única expresión se escriban de forma más escueta, al estilo de una expresión lambda:
public int TimesTwo (int x) => x * 2;
public string SomeProperty => "Property value";
Los inicializadores de propiedades(Capítulo 3) te permiten asignar un valor inicial a una propiedad automática:
public DateTime TimeCreated { get; set; } = DateTime.Now;
Las propiedades inicializadas también pueden ser de sólo lectura:
public DateTime TimeCreated { get; } = DateTime.Now;
Las propiedades de sólo lectura también pueden establecerse en el constructor, lo que facilita la creación de tipos inmutables (de sólo lectura).
Los inicializadores de índices(Capítulo 4) permiten inicializar en un solo paso cualquier tipo que exponga un indexador:
var dict = new Dictionary<int,string>()
{
[3] = "three",
[10] = "ten"
};
La interpolación de cadenas (véase "Tipo de cadena") ofrece una alternativa sucinta a string.Format
:
string s = $"It is {DateTime.Now.DayOfWeek} today";
Los filtros de excepción (ver "Sentencias try y excepciones") te permiten aplicar una condición a un bloque catch:
string html;
try
{
html = await new HttpClient().GetStringAsync ("http://asef");
}
catch (WebException ex) when (ex.Status == WebExceptionStatus.Timeout)
{
...
}
La directiva using static
(véase "Espacios de nombres") te permite importar todos los miembros estáticos de un tipo para que puedas utilizarlos sin calificarlos:
using static System.Console;
...
WriteLine ("Hello, world"); // WriteLine instead of Console.WriteLine
El operador nameof
(Capítulo 3) devuelve el nombre de una variable, tipo u otro símbolo en forma de cadena. Esto evita que se rompa el código cuando cambies el nombre de un símbolo en Visual Studio:
int capacity = 123;
string x = nameof (capacity); // x is "capacity"
string y = nameof (Uri.Host); // y is "Host"
Y por último, ahora puedes await
dentro de los bloques catch
y finally
.