Articulo de referencia

Do sostenido 2.0

El lenguaje de programación C# introduce varias características nuevas en la versión 2.0 (que corresponde a la tercera edición del estándar ECMA-334 y al .NET Framework 2.0 ). E...

El lenguaje de programación C# introduce varias características nuevas en la versión 2.0 (que corresponde a la tercera edición del estándar ECMA-334 y al .NET Framework 2.0 ). Estas incluyen:

Características de C# 2.0

Clase parcial

Las clases parciales permiten distribuir la implementación de una clase entre varios archivos, cada uno de los cuales contiene uno o más miembros de la clase. Resultan útiles principalmente cuando partes de una clase se generan automáticamente. Por ejemplo, esta función es muy utilizada por los diseñadores de interfaces de usuario que generan código en Visual Studio .

archivo1.cs:

public partial class MyClass { public void MyMethod1 () { // Código escrito manualmente } }

archivo2.cs:

public partial class MyClass { public void MyMethod2 () { // Código generado automáticamente } }

Medicamentos genéricos

Los genéricos , o tipos parametrizados, o polimorfismo paramétrico , son una característica de .NET 2.0 compatible con C# y Visual Basic. A diferencia de las plantillas de C++, los tipos parametrizados de .NET se instancian en tiempo de ejecución en lugar de por el compilador; por lo tanto, pueden ser compatibles entre lenguajes, mientras que las plantillas de C++ no. Admiten algunas características que no son compatibles directamente con las plantillas de C++, como las restricciones de tipo en los parámetros genéricos mediante el uso de interfaces. Por otro lado, C# no admite parámetros genéricos que no sean de tipo. A diferencia de los genéricos en Java, los genéricos de .NET utilizan la reificación para convertir los tipos parametrizados en objetos de primera clase en la máquina virtual de la CLI , lo que permite optimizaciones y la preservación de la información de tipo. [ 1 ]

Clases estáticas

Las clases estáticas son clases que no se pueden instanciar ni heredar, y que solo admiten miembros estáticos. Su propósito es similar al de los módulos en muchos lenguajes de programación procedimentales.

Funcionalidad del generador

El .NET Framework 2.0 permitió a C# introducir un iterador que proporciona funcionalidad de generadoryield return , utilizando una construcción similar a la yieldde Python . [ 2 ] Con un yield return, la función mantiene automáticamente su estado durante la iteración.

// Método que toma una entrada iterable (posiblemente un array) // y devuelve todos los números pares. public static IEnumerable < int > GetEven ( IEnumerable < int > numbers ) { foreach ( int i in numbers ) { if ( i % 2 == 0 ) yield return i ; } }

También hay una yield breakinstrucción en la que el control se devuelve incondicionalmente a quien llama al iterador. Hay una condición implícita yield breakal final de cada método generador.

delegados anónimos

Como precursor de las funciones lambda introducidas en C# 3.0, C# 2.0 añadió delegados anónimos. Estos proporcionan una funcionalidad similar a la de los cierres en C#. [ 3 ] El código dentro del cuerpo de un delegado anónimo tiene acceso completo de lectura/escritura a las variables locales, los parámetros de los métodos y los miembros de la clase en el ámbito del delegado, excepto outlos refparámetros. Por ejemplo:

int SumOfArrayElements ( int [] array ) { int sum = 0 ; Array . ForEach ( array , delegate ( int x ) { sum += x ; } ); return sum ; }

A diferencia de algunas implementaciones de cierre, cada instancia de delegado anónimo tiene acceso a la misma ubicación de memoria relativa para cada variable vinculada, en lugar de a los valores reales en cada creación. Consulte una explicación más detallada de esta distinción.

Covarianza y contravarianza delegadas

Las conversiones de grupos de métodos a tipos de delegados son covariantes y contravariantes en los tipos de retorno y de parámetros, respectivamente. [ 4 ]

La accesibilidad de los accesos a la propiedad se puede configurar de forma independiente.

Ejemplo:

estado de la cadena = cadena.Vacío ;public string Status { get { return status ; } // cualquiera puede obtener el valor de esta propiedad, protected set { status = value ; } // pero solo las clases derivadas pueden cambiarlo }

Tipos de valor anulables

Tipos de valores anulables (denotados por un signo de interrogación, por ejemplo int? i = null;) que se suman nullal conjunto de valores permitidos para cualquier tipo de valor. Esto proporciona una interacción mejorada con las bases de datos SQL, que pueden tener columnas anulables de tipos que corresponden a los tipos primitivos de C#: un INTEGER NULLtipo de columna SQL se traduce directamente al tipo de C# int?.

Los tipos de valor anulables recibieron una mejora a finales de agosto de 2005, poco antes del lanzamiento oficial, para mejorar sus características de empaquetadostruct Nullable<T> : una variable anulable a la que se le asigna null no es en realidad una referencia a null, sino una instancia con la propiedad HasValueigual a false. Al empaquetarla, Nullablese empaqueta la instancia misma, y ​​no el valor almacenado en ella, por lo que la referencia resultante siempre sería no nula, incluso para valores null. El siguiente código ilustra el fallo corregido:

int? i = null ; object o = i ; if ( o == null ) System . Console . WriteLine ( "Comportamiento correcto: versión de tiempo de ejecución de septiembre de 2005 o posterior" ); else System . Console . WriteLine ( "Comportamiento incorrecto: tiempo de ejecución de pre-lanzamiento (anterior a septiembre de 2005)" );

Al copiarlos en objetos, la versión oficial encapsula los valores de Nullablelas instancias, por lo que los valores nulos y las referencias nulas se consideran iguales. La tardanza en implementar esta corrección generó cierta controversia [ 5 ] , ya que requirió cambios en el núcleo de CLR que afectaron no solo a .NET2, sino también a todas las tecnologías dependientes (incluidas C#, VB, SQL Server 2005 y Visual Studio 2005).

Operador de coalescencia nula

El ??operador se denomina operador de coalescencia nula y se utiliza para definir un valor predeterminado para los tipos de valor anulables, así como para los tipos de referencia. Devuelve el operando izquierdo si no es nulo; de lo contrario, devuelve el operando derecho. [ 6 ]

objeto nullObj = null ; objeto obj = new Object (); return nullObj ?? obj ; // devuelve obj

El uso principal de este operador es asignar un tipo anulable a un tipo no anulable con una sintaxis sencilla:

int? i = null ; int j = i ?? 0 ; // Si i no es null, inicializa j a i. De lo contrario (si i es null), inicializa j a 0.

Referencias

  1. "Introducción a los genéricos de C#" . Microsoft . Enero de 2005. Consultado el 18 de junio de 2009 .
  2. "yield" . Referencia del lenguaje C# . Microsoft . Consultado el 26 de abril de 2009 .
  3. "Métodos anónimos (C#)" . Guía de programación de C# . Microsoft . Consultado el 18 de junio de 2009 .
  4. "Covarianza y contravarianza en delegados (C#)" . Guía de programación de C# . Microsoft . Consultado el 18 de junio de 2009 .
  5. Somasegar (11 de agosto de 2005). "Los valores nulos ya no faltan" . Blog de Somasegar . MSDN . Consultado el 5 de noviembre de 2008 .
  6. "?? Operador" . Referencia de C# . Microsoft . Consultado el 23/11/2008 .