Marcando uma classe estática em VB.NET

85

Conforme declarado em uma pergunta e resposta recente , você não pode herdar de uma classe estática. Como alguém impõe as regras que acompanham as classes estáticas dentro do VB.NET? Como a estrutura é compatível entre C # e VB, faria sentido haver uma maneira de marcar uma classe como estática, mas não parece haver uma maneira.

MagicKat
fonte

Respostas:

121

Módulo == classe estática

Se você deseja apenas uma classe que não pode herdar, use uma NotInheritableclasse; mas não será estático / compartilhado. Você poderia marcar todos os métodos, propriedades e membros como Shared, mas isso não é estritamente a mesma coisa que uma classe estática em C #, uma vez que não é aplicada pelo compilador.

Se você realmente deseja o equivalente VB.Net a uma classe estática C #, use a Module. Não pode ser herdado e todos os membros, propriedades e métodos são estáticos / compartilhados.

Joel Coehoorn
fonte
2
Retiro meu comentário anterior. Eu estava olhando para um módulo no refletor e o IL mostra como lacrado.
MagicKat
27
Você é um VBer? Um módulo é como um namespace. Todas as funções do VB são importadas dos módulos do VB e estão disponíveis no âmbito geral. Na minha opinião uma classe estática em vb não é um módulo, ela tem um comportamento diferente. se você quiser o comportamento da 'classe estática' em vb, deve ter NotInheritable e declarar todos os seus membros como 'Compartilhados', assim como você teria que fazer na classe estática do C #, eles se comportarão O MESMO. Um módulo NÃO.
Shimmy Weitzhandler
2
@Shimmy Não sei como não percebi esse comentário antes, mas você está enganado. Observe o IL gerado e os módulos recebem exatamente o mesmo tratamento que a classe estática. O VB apenas faz um trabalho extra para as funções padrão antigas para fazê-las aparecer no escopo global.
Joel Coehoorn
2
@JoelCoehoorn Module ≈≈ classe estática, pois um módulo deve ser declarado diretamente em um namespace. Isso significa que não se pode declarar um Módulo em um Módulo ou Classe.
LosManos de
20
@JoelCoehoorn O fato de que módulos e classes estáticas terminam com o mesmo IL é bom saber, mas o VB adicionalmente promove membros de um módulo para o namespace que o contém. O aspecto da promoção é onde os módulos e as classes estáticas diferem no uso prático e IMHO essa é uma diferença enorme. Prefiro a solução NotInheritable - construtor privado vazio - todos os membros compartilhados porque os membros só podem ser alcançados por meio da classe, que é um comportamento muito mais correto se você estiver tentando obter equivalência de classe estática. O IL pode ser diferente, mas isso é realmente acadêmico.
misha256
51

Quase lá. Você também deve evitar a instanciação.

NotInheritable Class MyStaticClass

    ''' <summary>
    ''' Prevent instantiation.
    ''' </summary>
    Private Sub New()

    End Sub

    Public Shared Function MyMethod() As String

    End Function

End Class
  • Compartilhado é como um método de classe estática.
  • NotInheritable é como selado.
  • Private New é como se a classe estática não pudesse ser instanciada.

Consulte:
MSDN - Classes estáticas e membros de classes estáticas

Gary Newsom
fonte
2
por que esta não é a resposta aceita? Obrigado pelo recorte de código
ArcherBird
6

Se você deseja apenas criar uma classe que não pode herdar, em C # você pode usar Sealed, e em VB.Net usar NotInheritable.

O equivalente VB.Net de estático é compartilhado.

Charles Graham
fonte
você marca suas variáveis ​​e funcionalidades como compartilhadas, assim como faria na classe estática do C #. Marcar como Não Herdável torna-o selado.
Shimmy Weitzhandler
5

Você pode criar uma classe estática em vb.net. A solução é

Friend NotInheritable Class DB
    Public Shared AGE As Integer = 20
End Class

A variável AGE é public static, você pode usá-la em outro código como este

 Dim myage As Integer = DB.AGE

Friend = public, NotInheritable = static

Mentor
fonte
3
Amigo! = Público, Amigo = interno
Altair
1
NotInheritable! = Static, NotInheritable == lacrado
Magnus
myage! = 20 (mais, infelizmente)
Grim
2

Do ponto de vista do CLR, a classe estática C # é apenas uma classe "selada" e "abstrata". Você não pode criar uma instância, porque ela é abstrata, e você não pode herdar dela, pois está lacrada. O resto é apenas uma mágica do compilador.

Ilya Ryzhenkov
fonte