.NET

26 ago, 2014

Linguagens C# e VB ganham “record class”

Publicidade

As linguagens C# e VB ganharam o que está sendo chamado de “record class”. Este novo recurso é essencialmente uma classe imutável definida unicamente pelo seu construtor. Sua finalidade é solucionar um problema comum na programação .NET com C# e VB: a quantidade de código repetitivo necessário para implementar objetos imutáveis. 

Veja um exemplo dessa especificação:

public record class Cartesian(double x: X, double y: Y);

Além do construtor, o compilador criará automaticamente uma propriedade somente leitura para cada parâmetro e uma função Equals. Ele também fará implementações de GetHashCode e ToString que sobreescrevem as implementações padrão e criará um operador “is”, conhecido como “Matches” no VB (que é utilizado em pattern matching – correspondência de padrões).

Além disso, classes “record” são muito parecidas com os tipos anônimos do C# (no VB, os tipos anônimos são mutáveis por padrão). A Microsoft está procurando formas de conciliar os dois conceitos, especialmente levando em conta a limitação da não exposição de tipos anônimos além de sua assembly atual.

Uma funcionalidade comum de tipos imutáveis é a habilidade de criar cópias do objeto com um ou mais campos atualizados. Apesar de ainda não fazer parte da especificação, esta opção está sendo considerada para o C#:

var x1 = new MyRecord(1, 2, 3);
var x2 = x1 with B: 16;
Console.WriteLine(x2) // prints something like "A = 1, B = 16, C = 3"

Por enquanto, apenas classes “record” são suportadas. Na teoria, structs do tipo record também poderiam ser adicionadas utilizando a mesma sintaxe e conceitos.

Preocupações de bibliotecas

Uma grande limitação dos tipos imutáveis no .NET é a falta de bibliotecas que suportem esta funcionalidade. Como exemplo, entre as atividades rotineiras de um desenvolvedor, uma das mais comuns é solicitar a um ORM objetos do banco de dados, os quais podem ser serializados como SOAP-XML ou JSON para comunicação com o cliente da aplicação.

Atualmente, a maioria dos ORMs e serializadores não tem suporte para tipos imutáveis. Ao invés disso, eles assumem que sempre irá existir um construtor sem parâmetros e propriedades mutáveis. Se isso não for alterado nos frameworks mais populares, as classes record terão pouco uso na maioria dos projetos.

Para mais informações sobre o assunto, veja o projeto da especificação Pattern Matching para C#. Um protótipo deve estar disponível em algumas semanas.

***

Com informações de InfoQ