CS8

Artículo

Lo nuevo en C# 8.0 (Parte I)

C# 8.0 (desde septiembre de 2019) está soportado en .Net Core 3.0 y .Net Standard 2.1. Para proyectos que utilicen C# 8.0 es necesario Visual Studio 2019 16.3 o superior. Este es el primero de una serie de artículos donde se muestran las nuevas características de lenguaje a la medida del desarrollador.

Las nuevas mejoras al lenguaje son:

  • Restricción de nulidad en tipos por referencias (bye bye to NullRefenceException!)
  • Asignación opcional
  • Declaraciones using
  • Indices y rangos
  • Enumerables asincrónos
  • Métodos de interfaz predeterminados
  • Mejoras de pattern matching
  • Miembros de solo lectura
  • Asincronía en disposables
  • Estructuras ref disposables
  • Mejora de las cadenas textuales interpoladas
  • Funciones locales estáticas
  • Tipos construidos no administrados
  • Stackalloc en expresiones anidadas

En este artículo se hablará de: restricciones de nulidad en tipos por referencia y de la asignación opcional.

Restricciones de nulidad en tipos por referencia. (Nullable reference types)

Con esta nueva bondad se intenta reducir al mínimo los errores provocados por no gestionar los valores null. El compilador de C# 8 asumirá que por defecto ningún valor (variable o parámetro) admite nulos. La intención es que el programador tenga que marcar explícitamente aquellos valores que necesariamente deben admitir nulos, esto es marcando su tipo formal con el símbolo de interrogación (?), como ya se venía haciendo con los tipos Nullable<ValueType>. El compilador de C# 8 reporta como warnings aquellas partes del código que potencialmente puedan generar errores en tiempo de ejecución.

El siguiente código daría error en tiempo de ejecución en C#7.0.

CS8 1

Sin embargo, en C#8.0 el editor mostrará un warning a la altura de la línea 3 (Listado 1 ) por asignar un valor nulo a un tipo que no admite null. Si el programador considera que esta variable sí que debe admitir nulos entonces debería marcarla como string?, y a continuación controlar el flujo para evitar la excepción en ejecución (Listado 2).

CS8 2

Sin miedo al NullReferenceException

C#8 cuenta con los tipos de referencia nulables, se ha añadido warnings en el código con nullables. Para evitar los NullReferenceException no controlados, he indicarle al compilador que se realicen estos chequeos el desarrollador debe activarlo a nivel de proyecto colocando la instrucción <Nullable>enable</Nullable> al elemento <PropertyGroup> en el fichero .csprj como se muestra a continuación (Listado 3):

CS8 3

o bien puede activarse a nivel de fichero utilizando la directiva como se muestra en el siguiente código.

CS8 4

Al compilar el proyecto con este código, se mostrará el siguiente warning para la línea 5 (Listado 4)

CS8 B1

Sin los tipos de referencia nullables, previo a C#8, se debía verificar la nulidad de los tipos formales que comprenden variables, parámetros, campos y tipo de retorno de métodos y propiedades; como se muestra en la validación que se hace de la lista en el siguiente código:

CS8 5

Con los tipos de referencia nullables se entiende que todos los tipos por defecto no son nullables así que el código anterior (Listado 5) se puede reescribir sin la validación del null:

CS8 6

Nótese que, aunque el parámetro list no va a ser null, si puede ser una lista vacía, entonces el resultado de la línea 2 si sería null. Por ello debe indicarse que el tipo de retorno del método es nullable.

Si fuera el caso que el parámetro list (Listado 6) tuviera que admitir necesariamente el valor null; entonces habría que indicar que su tipo formal List<Person> es nullable, y esto se indica con el símbolo: ?

CS8 7

De esta manera sucederá que el compilador mostrará un warning indicando que pueden haber nulls por el uso de este parámetro; y alerta sobre la necesidad de gestionar la condición de nulidad y propagarla hasta que sea apropiado como se ha hecho a continuación:

CS8 8

Gracias a este nuevo recurso del lenguaje a partir de su versión 8, nuestro código podrá ser más robusto y perderemos muchísimo menos tiempo buscando y corrigiendo desagradables bugs por causa de los nulls no controlados.

Asignación opcional

Con C#8 se nos presenta un nuevo operador para la asignación opcional (llamado también asignación de uso combinado de NULL) para asignar el valor de la parte derecha a la parte izquierda de la asignación solo en caso de la parte izquierda del operador de asignación evaluara a null. Esto se traduce en código C# como se muestra a continuación:

CS8 9

Como se muestra a la altura de la línea 11 (Listado 9) el resultado sería Hello. Esto se debe a que al llamar al método de extensión GetOrDefault<TKey, TValue> a la altura de la línea 4 el diccionario no tiene ningún registro con llave Hola, por lo que el valor de result será null. En la línea 5 como la parte izquierda del operador es null, por la asignación opcional el resultado del método será el valor que tiene el parámetro def.

A altura de la línea 13 el resultado sería Hi. Como en la línea 12 se le adicionó al diccionario el valor Hi para la llave Hola, la llamada al método de extensión GetOrDefault<TKey, TValue> en la línea 13 dará como resultado Hi. Como esta llave tiene valor, en la línea 5 no se cumple la condición para una asignación opcional, y no se le asigna entonces la parte derecha del operador de asignación opcional.

En siguientes entregas, continuaremos hablando de secuencias asíncronas, interfaces con implementaciones por defecto y pattern matching.

Más detalles en la especificación oficial del lenguaje: https://github.com/dotnet/csharplang

Contacto

Artículo de Johnna Cloded Menendez, senior specialist de Consultoría Tecnológica de Deloitte