Como sabemos la programación ha ido evolucionando, muchas de las cosas que estábamos acostumbrados a usar en nuestros inicios se han vuelto obsoletas, por tanto, como buenos desarrolladores debemos mantenernos actualizados, leyendo, aprendiendo cada día más, sobre los nuevas características y herramientas que van apareciendo que mucha veces nos facilitan la vida o nos las complican(frameworks javascript …. cof cof).

Gracias a Dios la forma en que hacemos las cosas en .Net Core y C# ya han dejado atrás muchas de las características no tan elegantes que veíamos en .Net Framework 3.5.

Microsoft se ha dado a la tarea de traer nuevas  características a C#, que permiten a tu código ser más eficiente y claro, y a ti más feliz y productivo. Ya conoces esas nuevas características y le estas sacando provecho????

A lo  largo de este artículo hablaremos de las nuevas características más interesantes y predominantes que ha traído C# 7.0 en adelante que te permitirán ser más eficiente y cool usando C#.

A partir de la versión 7.0 en adelante, los cambios más relevantes son las tuplas y pattern matching. Sin embargo, hay otras nuevas utilidades que son bastantes interesantes entre ellas:

  1. Indexing Fixed Field
  2. Out Variables
  3. Pattern Matching in Switch Statement
  4. Pattern Matching in Is Expression
  5. Local Functions
  6. Tuplas

 

Indexing fixed field

Los Indexadores son similares a las propiedades. De muchas maneras, los indexadores se basan en las mismas características  que las propiedades. Estos habilitan propiedades indexadas: propiedades referenciadas usando uno o más argumentos.

Debería ser capaz de escribir código que funcione de manera segura así evitarás errores como: el exceso de búfer, los punteros extraviados y otros errores de acceso a memoria. Indexing fixed field(campo fijo de indexación),  nos facilitará un toque este punto.

En las versiones anteriores a la  7.3 de C#, era requerido unir una variable para poder acceder a uno de los enteros que forman parte de myFixedField, este código compila en un contexto seguro:

En este caso no necesitamos declarar otra variable de tipo int. Todavía se requiere un contexto  “unsafe” sin embargo, no es necesario declarar un segundo puntero fixed.


Nota:

Un escenario en el que podrían resultar útiles los indexadores es cuando está desarrollando un API y defines los argumentos de esa colección. Tus Indexers  pueden o no mapear directamente con el tipo de la colección que son parte de .NET Framework, haciendo posible que los tipos de tu API solo hagan match a nivel de extracción evitando que tengas que exponer detalles de cómo tus datos están siendo almacenado o procesados.


Out Variables

En las versiones anteriores a la 7.0 de C# la palabra clave out  fue usada para pasar la referencia de un argumento a un método, a diferencia de ref, el parámetro out  no tiene que ser inicializado.

Para usar el parámetro out  tanto la definición como el llamado el método deben usar la palabra out. Incluso podemos definir directamente los parámetros en el método.

Pattern Matching

En resumidas cuentas el pattern matching son elementos sintácticos que pueden probar que un valor tiene cierta forma o patrón  y extraer información del valor cuando la tiene, En POO los métodos “overrides y virtual” proveen la sintaxis para para implementar métodos basados en un tipo de objeto. Sin embargo, las clases base y derivadas proveen diferentes implementaciones. Pattern Matching,  extiende este concepto y así puedes implementar patrones para tipos y elementos de data aunque no estén relacionados mediante herencia.

Pattern Matching, soporta dos expresiones el operador is  y switch.  Cada una permite inspeccionar un objeto y sus propiedades para determinar si ese objeto satisface patrón buscado.

Usando la expresión is con pattern matching

Un clásico ejemplo de cómo podría emplearse pattern matching con la expresión is  es el siguiente:

 

Usando Pattern matching con declaración de sentencia switch

Si nuestro número de condiciones va creciendo, lo más conveniente es que usemos un switch y de la mejor manera, usando pattern matching,  el siguiente código es una forma sencilla de mostrar la aplicación del mismo:

 

Local Functions

Algunas veces necesitamos una función que solo será utilizada en un determinado contexto. En este caso es conveniente usar  funciones locales, las cuales permiten declarar funciones dentro de otras.

De este modo se hace más entendible nuestro código, pues podremos visualizar dicha función donde se requiere sin dar muchas vueltas. Como veremos en el siguiente ejemplo:

Los parámetros y las variables locales del ámbito adjunto están disponibles dentro de una función local, al igual que en las expresiones lambda.

Tuplas

En muchas ocasiones vamos a querer retornar más de un valor de un método, en las versiones anteriores no habían formas tan elegantes para realizar esto como con el uso de tuplas.

En este ejemplo vamos a retornar el valor máximo y mínimo en una secuencia de enteros.

Las ventajas de usar tuplas aparte de la eficiencia y ahorro de tiempo, tenemos:

  • Clave compuesta en un diccionario.
  • Fácil acceso y manipulación del conjunto de datos.
    Reemplazo de una clase, cuyo único propósito es transportar los datos y enlazar un Combo box u otro control.
  • Pase los múltiples valores a la función / método.

 

Que viene después?

Tenemos algunas ideas sobre lo que podría estar en C# 8, según las discusiones en foros, algunas de estas características puede que no sean incluidos o tal vez si! Las más relevantes que podemos mencionar son:

  • Non-Nullable & Nullable Reference Types
  • Solving Object Equality with Records
  • Default Interface Implementations

Serán o no incluidas?, lo sabremos pronto! pues ya andamos en C# 7.3, puedes mantenerte al tanto siguiendo los foros e hilos oficiales:

https://github.com/dotnet/csharplang

https://github.com/dotnet/csharplang/milestones

Conclusiones

C# seguirá avanzando, es un nuestro trabajo como programadores darles “alas” a nuestro código manteniéndonos actualizados y sacándole el mejor provecho a las características del lenguaje para ser más productivos.