¿Qué son los record types en C#?

En este post te voy a explicar que son los record types en C#, su diferencia con las clases y como puedes emplearlos.

¿Qué es un record type?

Un record type es un tipo por referencia que contiene ciertos métodos pre construidos que te ayudan a trabajar con datos más fácilmente que con una clase normal. En mi caso, ya trabaje con el concepto de las case classes en Scala. Y tanto las case classes  en Scala como los records en C# buscan reducir el boilerplate con classes que contengan datos.

¿Qué de nuevo tienen los record types?.

Las instancias de una record class son más rápidas de escribir, no necesitas especificar el tipo (como en Scala), aunque puedes hacerlo si así lo deseas. También, cualquier argumento que le pases al record se convertirá en propiedad de solo lectura, no necesitas especificar sus respectivos getters y setters. Puedes agregar métodos y propiedades adicionales como en una clase normal.

La posición de los argumentos, importa.

Las record classes hacen uso del deconstruct pattern, este consiste en descomponer las propiedades de un objeto en una tupla. El orden en que pongas las propiedades y valores en tu record influirá en como se deconstruyen en una tupla. Por default, únicamente se implementa el método deconstruct con los argumentos que especificas en el constructor. Si requieres deconstruir tu objeto en otro tipo diferente de tupla, entonces, tendrás que escribir tu propia implementación del método Deconstruct.

Inmutabilidad.

Los record classes están pensados para ser inmutables. Aunque, esto no te impide agregar propiedades o estados que pueden ser modificados luego de la instancia de la clase. Lo ideal, es que reduzcas los puntos de mutación de tus record classes siempre que puedas. El problema que siempre hemos tenido en C# con los objetos inmutables que cambien de estado es que es muy verboso y molesto clonarlos. Ahora podemos cambiar el estado de un record con «with».

El método ToString()

El método toString en los records ahora te servirá para mostrar información de las propiedades, en lugar de solo retornar el tipo.

Herencia.

Esto se pone interesante. Los records no van a poder heredar de una clase normal, y tampoco las clases normales van a poder heredar de un record. Un record puede declararse como abstract, si necesitas mezclar records y non-records en una jerarquía tu única alternativa serán las interfaces.

Igualdad y comparación.

Las record classes vienen con mucho cableado para reducir la comparación. En las clases o estructuras normales, si quieres ocupar == y !=, entonces, tienes que implementar tu propia sobrecarga de operadores. Con los records podrás comparar más eficientemente. Este tema planeo revisarlo a fondo más adelante.

Conclusiones.

Este tipo de clases son muy bien recibidas de mi parte, van a solucionar muchos problemas que ya teníamos con DotNet. Pero también, con cada iteración de C# se nota hacia donde va. Creo, Microsoft quiere C# tenga más peso con el paradigma funcional, que con el orientado a objetos. Estos paradigmas no son mutuamente excluyentes.

Gustavo Sánchez