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:
NET - Unit of Work - Padrão Unidade de ...