Advertencia: Las nuevas funcionalidades de C# 11 se encuentran en modo preview y es posible que sufran cambios.
Ya podemos revisar alguna de la novedades que traerá C# 11, para ello deberás instalar .NET 6.0.200 y configurar la propiedad LangVersion
con el valor Preview en los ficheros .csproj de tus proyectos:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<LangVersion>preview</LangVersion>
</PropertyGroup>
</Project>
Puedes encontrar el código fuente de los ejemplos en el siguiente repositorio: https://github.com/fjvela/csharp-11
Raw strings
Hasta ahora la manera de poder definir cadenas de texto multilínea en C# es utilizar el prefijo @. Uno de los problemas que presenta es que si se identa el texto la salida del este se verá afectada o si se utilizan comillas es necesario escaparlas.
C# 11 incluirá una nueva manera de definir cadenas de texto, para ello deberemos utilizar como mínimo tres comillas """
. Esto nos facilitará poder identar cadenas de texto en nuestro código y evitar tener que escapar las comillas.
Definición de cadenas de texto multilínea en C#
var myString = @"
<element attr=""content""/>";
Resultado:
<element attr="content"/>
Definición de cadenas de texto multilíneas en C# 11
var myStringRaw = """
<element attr="content"/>
""";
Resultado:
<element attr="content"/>
Simplified parameter null validation code (!!)
A la hora de validar si un parámetro tiene un valor nulo podemos utilizar el siguiente código:
void MyAwesomeMethod(string mystring)
{
if (mystring == null)
throw new ArgumentNullException(nameof(mystring));
}
C# 11 nos ofrecerá realizar esta comprobación de una manera más sencilla, tan solo tenemos que añadir !!
como sufijo al nombre del parámetro:
void MyAwesomeMethod(string mystring!!)
{
}
List pattens
Nos permitirá comparar un patrón con un array o list de elementos, por lo que podríamos definir un método con los siguientes patrones:
int CheckSwitch(int[] values) => values switch
{
[1, 2, .., 10] => 1,
[1, 2] => 2,
[1, _] => 3,
[1, ..] => 4,
[21] => 5,
[21, _, ..] => 6,
[33, _, 34, .., 44] => 7,
[_, ..] => 50
};
El resultado de la ejecución sería:
Console.WriteLine(CheckSwitch(new[] { 1, 2, 10 })); // prints 1
Console.WriteLine(CheckSwitch(new[] { 1, 2, 7, 3, 3, 10 })); // prints 1
Console.WriteLine(CheckSwitch(new[] { 1, 2 })); // prints 2
Console.WriteLine(CheckSwitch(new[] { 1, 3 })); // prints 3
Console.WriteLine(CheckSwitch(new[] { 1, 3, 5 })); // prints 4
Console.WriteLine(CheckSwitch(new[] { 2, 5, 6, 7 })); // prints 50
Console.WriteLine(CheckSwitch(new[] { 21, 52, 63, 74, 5 })); // prints 5
Console.WriteLine(CheckSwitch(new[] { 21 })); // prints 6
Console.WriteLine(CheckSwitch(new[] { 33, 0, 34, 1, 2, 3, 44 })); // prints 7