Textual description of firstImageUrl

Novedades de la version C# 8.0

La versión 8.0 del lenguaje C# recoge las sugerencias de la comunidad de desarrollo. Veamos algunas de las más sobresalientes:

Tipos de Referencia Anulable (Nullable Reference Types):

A diferencia de los tipos por referencia, que pueden ser nulos sin problema, los tipos primitivos deben contener algún valor correcto. Una de las características que se incorpora desde C# 2.0 es la de que los tipos primitivos puedan ser asignados a null.

// tipo por referencia, correcto 
String cadena = null; 

// tipo primitivo, incorrecto 

int entero = null; 

// tipo anulable, correcto 
int? entero = null; 

// en el tipo bool, null equivale a false 
bool? booleano = null;

En la versión 8.0, los tipos de referencia no serían más anulables por defecto. En lugar de esto se deberían marcar explícitamente utilizando la misma sintaxis "Tipo?" que se utiliza para tipos de valor anulable.

Asignar un nulo a un tipo referencial no anulable generará una advertencia de compilación. Igualmente, leer de un tipo anulable sería una advertencia de compilador a menos que la variable en cuestión fuera explícitamente verificada en su nulidad antes de accederla. En teoría pues, el único cambio que verían los programadores es que tendrían que insertar algunos caracteres de interrogación aquí y allá donde sea requerido.

Pero una nueva sintaxis ha sido agregada a esta característica. Considere un escenario donde se sabe que la variable anulable x no es nula, pero no se le puede demostrar esto al compilador. En este caso se puede usar x!.Method() para suprimir la advertencia de compilador acerca de potenciales futuras referencias a nulo.

Streams Asincrónicas


Las streams asincrónicas son el equivalente asincrónico de IEnumerable. Las streams asincrónicas es algo que se viene trabajando desde 2015. Después de mucho debate la sintaxis finalmente escogida es:
foreach await (string s in asyncstream)

Cuando se define un iterador asincrónico, se utilizaría esta firma de función:
async IAsyncEnumerable<T> MethodName()

Como con métodos IEnumerable normales, se puede usar "yield return" para construir el stream de objetos de manera Lazy.
El beneficio de usar esto en lugar de IObservable de Reactive Extensions (Rx) es que el consumidor controla la tasa de flujo. Esto se denomina modelo pull. En contraste, IObservable es un modelo push, lo cual significa que el productor puede desbordar al consumidor con una tasa de flujo mayor a la que puede manejar.

Implementaciones de interfaz por defecto

La implementaciones de interfaz por defecto son esencialmente una forma limitada de herencia múltiple. Es permitirá que interfaces abstractas definan completamente los métodos tal como las clases abstractas. Sin embargo, las interfaces abstractas no serán capaces de declarar constructores o campos.
Nota: se pueden simular campos en una interfaz usando ConditionalWeakTable. El principal beneficio de las implementaciones de interfaz por defecto es se pueden añadir nuevos métodos a una interfaz existente sin afectar la compatibilidad hacia atrás. No hay garantía, porque funcionaría solo cuando pueda diseñarse un método por defecto apropiado.
Diagrama de clases de la implementacion simple del Pool de Objetos

Extensión para Todo

Una desventaja que el C# ha tenido por mucho tiempo es que se podían escribir métodos de extensión, pero no propiedades de extensión. De hecho, no hay forma de tan siquiera definir una propiedad o evento de extensión usando el patrón actual. Adicionalmente, poner métodos de extensión en clases estáticas se siente "extraño" para mucha gente. Bajo el nuevo diseño hay una nueva construcción de alto nivel llamada "extension". Por ejemplo,si se quiere crear métodos y propiedades de extensión para una clase Cliente se Escribiría así:

extension ClienteExt extends Cliente { 
//métodos y propiedades de la clase

}


Como con las interfaces, no se pueden definir campos de instancia en extensiones pero se pueden simular usando ConditionalWeakTable. También se pueden definir campos estáticos.
Además de propiedades, eventos y sobrecargas de operadores, se está considerando aun permitir constructores de extensión. Los constructores de extensión serian muy interesantes en escenarios de fábricas (patrones de diseño) y pooles de objetos.

Interfaces de extensión

Las interfaces de extensión, la capacidad de agregar nuevas interfaces a clases existentes, también está en consideración. Esta no seria una característica de C# 8.0, dado que necesitaría cambiar el runtime subyacente.

No hay comentarios.:

Publicar un comentario