Open Menu dzosoft
Close Menu dzosoft

   TODO SOBRE INFORMÁTICA Y TECNOLOGÍA


                             







 
 
 

C# Versión 12.0

 
 
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

y

struct

. Los constructores primarios ya no están restringidos a los tipos

record

. 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 sintaxis

this()

. Agregar un constructor primario a

class

evita que el compilador declare un constructor implícito sin parámetros. En

struct

, 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

o

record 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 y System.ReadOnlySpan .
⮚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 b = ["one", "two", "three"];
// Create a span Span c = ['a', 'b', 'c', 'd', 'e', 'f', 'h', 'i'];
// Create a jagged 2D array: int[][] twoD = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
// Create a jagged 2D array from variables: int[] row0 = [1, 2, 3]; int[] row1 = [4, 5, 6]; int[] row2 = [7, 8, 9]; int[][] twoDFromVariables = [row0, row1, row2];

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ámetros

ref readonly

 

C# agregó parámetros

in

como una forma de pasar referencias de solo lectura. Los parámetros

in

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ámetros

ref

o parámetros

in

:

⮚Las API creadas antes de que se introdujera

in

podrían usar

ref

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ámetro

ref

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.ReadOnlySpan(T).
⮚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 o System.ReadOnlySpan objetos de las API de tiempo de ejecución.

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

son

experimental

. 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.
Leave comment
          

Guardar apodo y correo electrónico en este navegador para la próxima vez.



Cargando...