logoImagina
iconCurso
Te recomendamos nuestro curso de C# 11
Descubre el curso de C# 11
Ir al curso
Descubre la formación a tu medida
Rellena el formulario para obtener más información sobre los cursos.
Tamaño de la empresa *
Términos y condiciones *

Novedades C# 8: Aquí tienes un repaso de todas ellas

iconImage
Publicado 2024-03-01
Actualizado el 2024-03-21

¿Que es C#?

Es un lenguaje de programación orientado a objetos desarrollado por Microsoft. Deriva de los lenguajes C, C++, pero aplicando el sistema de objetos de Java. Su nombre viene de añadir otros dos ++ a C++, lo cual resultaría en #. Este lenguaje además soporta la mayoría de paradigmas de programación, incluyendo tales como el tipado dinámico y su contraparte el estático, y características funcionales.

A continuación, vamos a repasar todas las novedades que incluye la versión de C# 8.

Implicit constructors

Se trata de una novedad muy sencilla y fácil de usar, en versiones anteriores si teníamos un array y queríamos inicializarlo debíamos poner un new nombreArray(...) en cada elemento del array, con esta mejora ya podremos omitirlo y no será necesario escribirlo tantas veces. Vamos a ver un ejemplo para entenderlo mejor:

1nombres[ ] personas ={new (Pepito,Perez,Sanchez),new(María”,Villanueva,García”),new(Manuel,Soler,Cervantes),};

Using declaration

Una declaración using es una declaración de variable precedida por la palabra clave using. Indica al compilador que la variable que se declara debe eliminarse al final del ámbito de inclusión. Por ejemplo, considere el siguiente código que escribe un archivo de texto.

1static void WriteLinesToFile(IEnumerable<string> lines){ using var file = new System.IO.StreamWriter("WriteLines2.txt"); 2 foreach (string line in lines) { 3 // If the line doesn't contain the word 'Second', write the line to the file. 4 if (!line.Contains("Second")) { 5 file.WriteLine(line); 6 } 7 } 8}

Nullable reference types

Las variables de tipo de referencia no acepta valores NULL. Pero añadiendo al nombre del tipo de referencia el signo ? se declara la variable como un tipo de referencia que si acepta valores NULL.

En los tipos de referencia que no aceptan valores NULL, el compilador usa el análisis de flujo para garantizar que las variables locales se inicializan en un valor no NULL cuando se declaran. Los campos se deben inicializar durante la construcción. Si la variable no se establece mediante una llamada a alguno de los constructores disponibles o por medio de un inicializador, el compilador genera una advertencia. Además, los tipos de referencia que no aceptan valores NULL no pueden tener asignado un valor que podría ser NULL.

Property patterns

El patrón de propiedades permite hallar la coincidencia con las propiedades del objeto examinado. Considere un sitio de comercio electrónico que debe calcular los impuestos de ventas según la dirección del comprador. Ese cálculo no es una responsabilidad fundamental de una clase Addres. Cambiará con el tiempo, probablemente con más frecuencia que el formato de dirección. El importe de los impuestos de ventas depende de la propiedad State de la dirección. El método siguiente usa el patrón de propiedades para calcular los impuestos de ventas a partir de la dirección y el precio.

Estructuras ref descartables

Un elemento struct declarado con el modificador ref no puede implementar ninguna interfaz y, por tanto, no puede implementar IDisposable. Por lo tanto, para permitir que se elimine un elemento ref struct, debe tener un método void DIspose() accesible. Esto también se aplica a las declaraciones readonly ref struct.

Descubre la formación a tu medida
Rellena el formulario para obtener más información sobre los cursos.
Tamaño de la empresa *
Términos y condiciones *

Patrones de tupla

Algunos algoritmos dependen de varias entradas. Los patrones de tupla permiten hacer cambios de función de varios valores, expresados como una tupla. El código siguiente muestra una expresión switch del juego piedra, papel, tijeras:

1public static string RockPaperScissors(string first, string second) => (first, second) switch { 2 ("rock", "paper") => "rock is covered by paper. Paper wins.", 3 ("rock", "scissors") => "rock breaks scissors. Rock wins.", 4 ("paper", "rock") => "paper covers rock. Paper wins.", 5 ("paper", "scissors") => "paper is cut by scissors. Scissors wins.", 6 ("scissors", "rock") => "scissors is broken by rock. Rock wins.", 7 ("scissors", "paper") => "scissors cuts paper. Scissors wins.", 8 (_, _) => "tie" 9};

Los mensajes indican el ganador.

Default interfaces

Los métodos de interfaz predeterminados(también conocidos como métodos de extensión virtual) permitirá a los desarrolladores utilizar la técnica de programación de rasgos, son una tecnología de programación orientada a objetos que promueve la reutilización de métodos entre clases no relacionadas.

El principal beneficio que brindan los métodos predeterminados es que ahora es posible agregar un nuevo método predeterminado a una interfaz existente sin romper las clases que implementan esa interfaz. En otras palabras, esta característica hace que sea opcional para los implementadores anular el método o no.

Range and index

Los rangos e índices proporcionan una sintaxis concisa para especificar subrangos en una matriz.

Puede especificar un índice desde el final. Para especificar desde el final, puede usar el operador ^. Está familiarizado con array[2] lo que significa el elemento “2 desde el principio”. Ahora, array2 significa el elemento “2 desde el final”. El índice ^0 significa “el final” o el índice que sigue al último elemento.

Puede especificar un rango con el operador de rango: .. .Por ejemplo, 0..^0 especifica el rango completo de la matriz: 0 desde el principio hasta, pero sin incluir 0 desde el final. Cualquier operando puede usar “desde el principio” o “desde el final”. Además, se puede omitir cualquier operando. Los valores predeterminados son 0 para el índice de inicio y ^0 para el índice final.

1var words = new string[] 2{ 3 // index from start index from end 4 "The", // 0 ^9 5 "quick", // 1 ^8 6 "brown", // 2 ^7 7 "fox", // 3 ^6 8 "jumped", // 4 ^5 9 "over", // 5 ^4 10 "the", // 6 ^3 11 "lazy", // 7 ^2 12 "dog" // 8 ^1 13};

El índice de cada elemento refuerza el concepto de “desde el inicio” y “desde el final”, y que los rangos son exclusivos del final del rango. El “inicio” de toda la matriz es el primer elemento. EL “final” de toda la matriz es pasado el último elemento.

Puede recuperar la última palabra con el índice ^1:

1Console.WriteLine($"The last word is {words[^1]}");// writes "dog"

El siguiente código crea un subrango con las palabras “quick”, “brown” y “fox”. Va de words[1] a words[3]. El elemento words[4] no está en el rango.

1var quickBrownFox = words[1..4];

El siguiente código crea un subrango con “lazy” y “dog”. Incluye words2 y words1. El índice del final words0 no se incluye:

1var lazyDog = words[^2..^0];

En los ejemplos siguientes se crean rangos con final abierto para el inicio, el final o ambos:

1var allWords = words[..]; // contains "The" through "dog". 2var firstPhrase = words[..4]; // contains "The" through "fox" 3var lastPhrase = words[6..]; // contains "the, "lazy" and "dog"

También puede declarar rangos como variables:

1Range phrase = 1..4;

El rango se puede usar luego dentro de los caracteres [  ]:

1var text = words[phrase];

Expresiones switch

Una instrucción switch genera un valor en cada uno de sus bloques case. Las expresiones switch le permite usar una sintaxis de expresiones más concisa. Hay menos palabras clave case y break repetitivas y menos llaves. Ejemplo:

1public enum Arco_Iris 2{ 3 Red, 4 Orange, 5 Yellow, 6 Green, 7 Blue, 8 Indigo, 9 Violet 10} 11 12public static RGBColor FromArcoIris(Arco_Iris colorBand) => 13 colorBand switch 14 { 15 Arco_Iris.Red => new RGBColor(0xFF, 0x00, 0x00), 16 Arco_Iris.Orange => new RGBColor(0xFF, 0x7F, 0x00), 17 Arco_Iris.Yellow => new RGBColor(0xFF, 0xFF, 0x00), 18 Arco_Iris.Green => new RGBColor(0x00, 0xFF, 0x00), 19 Arco_Iris.Blue => new RGBColor(0x00, 0x00, 0xFF), 20 Arco_Iris.Indigo => new RGBColor(0x4B, 0x00, 0x82), 21 Arco_Iris.Violet => new RGBColor(0x94, 0x00, 0xD3), 22 _ => throw new ArgumentException(message: "invalid enum value", paramName: nameof(colorBand)), 23 };

Aprende C# desde cero

Sigue formándote en el mundo de la programación y no pierdas la oportunidad de consultar la página de nuestro curso de C#.

Descubre la formación a tu medida
Rellena el formulario para obtener más información sobre los cursos.
Tamaño de la empresa *
Términos y condiciones *
iconClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClient