C# Versión 12.0 | |
![]() | |
C# 12 incluye las siguientes características nuevas. Puede probar estas funciones utilizando la última versión de Visual Studio 2022 o SDK de .NET 8. | |
⮚Constructores primarios - Introducido en Visual Studio 2022 versión 17.6 Vista previa 2. | |
⮚Expresiones de colección - Introducidas en Visual Studio 2022 versión 17.7 Vista previa 5. | |
⮚matrices en línea - Introducidas en Visual Studio 2022 versión 17.7 Vista previa 3. | |
⮚parámetros< opcionales /strong> en expresiones lambda: introducido en Visual Studio 2022 versión 17.5 Preview 2. | |
⮚parámetros de solo lectura de referencia - Introducido en Visual Studio 2022 versión 17.8 Preview 2. | |
⮚Alias de cualquier tipo - Introducido en Visual Studio 2022 versión 17.6 Preview 3. | |
⮚Atributo experimental - Introducido en Visual Studio 2022 versión 17.7 Vista previa 3. | |
⮚Interceptores - Función de vista previa introducida en Visual Studio 2022 versión 17.7 Vista previa 3. | |
Constructores primarios | |
Ahora puede crear constructores primarios en cualquier class ystruct . Los constructores primarios ya no están restringidos a los tiposrecord . Los parámetros del constructor principal tienen alcance para todo el cuerpo de la clase. Para garantizar que todos los parámetros del constructor principal estén definitivamente asignados, todos los constructores declarados explícitamente deben llamar al constructor principal usando la sintaxisthis() . Agregar un constructor primario aclass evita que el compilador declare un constructor implícito sin parámetros. Enstruct , el constructor implícito sin parámetros inicializa todos los campos, incluidos los parámetros del constructor primario en el patrón de 0 bits. | |
El compilador genera propiedades públicas para los parámetros del constructor primario solo en tipos de registro, ya sea record class orecord struct tipos. Es posible que las estructuras y clases no registradas no siempre deseen este comportamiento para los parámetros del constructor principal. | |
Puede obtener más información sobre los constructores primarios en el tutorial de explorando constructores primarios y en el artículo sobre constructores de instancias>. | |
Expresiones de colección. | |
Las expresiones de colección introducen una nueva sintaxis concisa para crear valores de colección comunes. Es posible insertar otras colecciones en estos valores utilizando un operador de extensión... | |
Se pueden crear varios tipos similares a colecciones sin necesidad de soporte BCL externo. Estos tipos son: | |
⮚Tipos de matrices, como int[] . | |
⮚System.Span | |
⮚Tipos que admiten inicializadores de colecciones, como System.Collections.Generic.List | |
Los siguientes ejemplos muestran usos de expresiones de colección: | |
// Create an array: int[] a = [1, 2, 3, 4, 5, 6, 7, 8]; // Create a list: List |
El operador de extensión, .. en una expresión de colección reemplaza su argumento con los elementos de esa colección. El argumento debe ser de tipo colección. Los siguientes ejemplos muestran cómo funciona el operador de extensión: |
int[] row0 = [1, 2, 3]; int[] row1 = [4, 5, 6]; int[] row2 = [7, 8, 9]; int[] single = [.. row0, .. row1, .. row2]; foreach (var element in single) { Console.Write($"{element}, "); } // output: // 1, 2, 3, 4, 5, 6, 7, 8, 9, |
El operando de un operador de extensión es una expresión que se puede enumerar. El operador de extensión evalúa cada elemento de la expresión de enumeraciones. | |
Puede utilizar expresiones de colección en cualquier lugar donde necesite una colección de elementos. Pueden especificar el valor inicial de una colección o pasarse como argumentos a métodos que toman tipos de colección. Puede obtener más información sobre las expresiones de colección en la referencia del idioma. artículo sobre expresiones de colección o la especificación de la característica. | |
Parámetrosref readonly | |
C# agregó parámetros in como una forma de pasar referencias de solo lectura. Los parámetrosin permiten tanto variables como valores, y se pueden usar sin ninguna anotación en los argumentos. | |
La adición de parámetros ref readonly permite una mayor claridad para las API que podrían estar usando parámetrosref o parámetrosin : | |
⮚Las API creadas antes de que se introdujera in podrían usarref aunque el argumento no se modifique. Esas API se pueden actualizar con p**ref readonly. No será un cambio importante para las personas que llaman, como lo sería si el parámetroref se cambiara a in. Un ejemplo es System.Runtime.InteropServices.Marshal.QueryInterface. | |
⮚API que toman un parámetro in , pero lógicamente requieren una variable. Una expresión de valor no funciona. Un ejemplo es System.ReadOnlySpan | |
⮚API que usan ref porque requieren una variable, pero no mutan esa variable. Un ejemplo es Sistema. Runtime.CompilerServices.Unsafe.IsNullRef. | |
Para obtener más información sobre los parámetros ref readonly , consulte el artículo en modificadores de parámetros en la referencia del idioma, o la especificación de la función de parámetros ref readonly. | |
Parámetros lambda predeterminados | |
Ahora puede definir valores predeterminados para los parámetros en expresiones lambda. La sintaxis y las reglas son las mismas que agregar valores predeterminados para los argumentos de cualquier método o función local. | |
Puede obtener más información sobre los parámetros predeterminados en expresiones lambda en el artículo en expresiones lambda. | |
Alias de cualquier tipo | |
Puede utilizar la directiva p**using alias para asignar un alias a cualquier tipo, no solo a los tipos con nombre. Eso significa que puede crear alias semánticos para tipos de tuplas, tipos de matrices, tipos de punteros u otros tipos no seguros. Para obtener más información, consulte especificación de características. | |
Arreglos en línea | |
El equipo de ejecución y otros autores de bibliotecas utilizan matrices en línea para mejorar el rendimiento de sus aplicaciones. Las matrices en línea permiten a un desarrollador crear una matriz de tamaño fijo en un tipo struct . Una estructura con un búfer en línea debe proporcionar características de rendimiento similares a un búfer de tamaño fijo inseguro. Probablemente no declarará sus propias matrices en línea, pero las usará de forma transparente cuando estén expuestas como System.Span | |
Se declara una matriz en línea similar a la siguiente estructura: | |
[System.Runtime.CompilerServices.InlineArray(10)] public struct Buffer { private int _element0; } |
You use them like any other array: | |
var buffer = new Buffer(); for (int i = 0; i < 10; i++) { buffer[i] = i; } foreach (var i in buffer) { Console.WriteLine(i); } |
La diferencia es que el compilador puede aprovechar información conocida sobre una matriz en línea. Probablemente consuma matrices en línea como lo haría con cualquier otra matriz. Para obtener más información sobre cómo declarar matrices en línea, consulte la referencia del idioma en tipos de estructura. | |
Atributo experimental | |
Los tipos, métodos o ensamblajes se pueden marcar con System.Diagnostics.CodeAnalysis.ExperimentalAttribute para indicar una característica experimental. El compilador emite una advertencia si accede a un método o tipo anotado con el Atributo Experimental. Todos los tipos incluidos en un ensamblaje marcado con el atributo Experimental sonexperimental . Puede leer más en el artículo sobre General atributos leídos por el compilador o el destino especificación de características. | |
Interceptores | |
Un interceptor es un método que puede sustituir de forma declarativa una llamada a un método interceptable con una llamada a sí mismo en tiempo de compilación. Esta sustitución se produce haciendo que el interceptor declare las ubicaciones de origen de las llamadas que intercepta. Los interceptores brindan una facilidad limitada para cambiar la semántica del código existente agregando código nuevo a una compilación, por ejemplo en un generador de código fuente. | |
Se utiliza un interceptor como parte de un generador de código fuente para modificar, en lugar de agregar código, a una compilación de código fuente existente. El generador de código fuente sustituye las llamadas a un método interceptable por una llamada al método interceptor. | |
Si está interesado en experimentar con interceptores, puede obtener más información leyendo el especificación de características. Si utiliza la función, asegúrese de mantenerse actualizado con cualquier cambio en la especificación de la función para esta función experimental. |
![]() |