C# 11 -  Membros abstratos estáticos


  Hoje veremos o novo recurso do C# 11 : Membros abstratos estáticos

Os membros abstratos estáticos já existiam e foram introduzidos com o .NET 6 mas como um preview.

Antes do .NET 6, marcar um membro estático como virtual ou abstrato era ilegal. Ou seja, se você marcar um membro estático como abstrato ou virtual estava gerando um erro do compilador – semelhante ao que é mostrado abaixo.



Desta forma, até o .NET 6, membros abstratos estáticos não eram permitidos nas interfaces.

Com o C# 11 e o .NET 7, esse recurso agora esta disponível para todos. Isso significa que, se o projeto for direcionado para .NET 7 e C# 11, esse recurso será habilitado por padrão.

Qual é o novo comportamento?

No C# 11 você não vai receber nenhum erro se definir um membro abstrato estático. Portanto, se eu criar um novo aplicativo console no .NET 7 e adicionar a mesma interface mostrada acima, não teremos o erro.

Onde esse recurso pode ser útil?

Esse recurso pode ser útil quando se trata de lidar com genéricos. Se um método tiver um parâmetro de tipo genérico e esse método precisar chamar um método estático desse parâmetro de tipo genérico, não havia uma maneira fácil de fazer isso.

Uma opção era usar conversão de tipo ou a outra opção era declarar o método como método de membro.

Esse novo recurso seria útil em tais cenários. Podemos incluir os membros abstratos estáticos nas interfaces e, em seguida, podemos especificar uma restrição no método genérico que o parâmetro de tipo deve ser derivado dessa interface específica. Feito isso, o método genérico pode chamar facilmente o método estático.

Demonstração - Operação matemática genérica

Agora, vamos dar uma olhada em um exemplo para entender este recurso funcionando:

Considere que existe uma interface IEsporte, que possui um membro abstrato estático – IsTimeEsporte, para identificar se uma time é necessário para praticar o esporte.

Então, existem 4 implementações diferentes dessa interface:

Agora, vamos definir um método Exibir(), que é um método genérico e recebe um parâmetro de tipo. Este parâmetro de tipo tem uma restrição e, de acordo com essa restrição, o tipo deve ser derivado da interface – IEsporte.

A definição do método é mostrada abaixo :

Resultado da execução :

Sem o membro abstrato estático na interface IEsporte, não seria possível chamar o método estático sem conversão de tipo ou sem usar Reflection.

Mas como podemos ver no código acima, chamar o método estático ficou muito mais fácil.

E estamos conversados...

Referências:


José Carlos Macoratti