Contrassegnare una classe statica in VB.NET


85

Come appena affermato in una recente domanda e risposta , non puoi ereditare da una classe statica. Come si applicano le regole che accompagnano le classi statiche all'interno di VB.NET? Poiché il framework è compatibile tra C # e VB, avrebbe senso che ci sarebbe un modo per contrassegnare una classe statica, ma non sembra esserci un modo.

Risposte:


121

Modulo == classe statica

Se vuoi solo una classe che non puoi ereditare, usa una NotInheritableclasse; ma non sarà statico / condiviso. È possibile contrassegnare tutti i metodi, le proprietà e i membri come Shared, ma non è esattamente la stessa cosa di una classe statica in C # poiché non è applicata dal compilatore.

Se vuoi davvero l'equivalente di VB.Net a una classe statica C #, usa un file Module. Non può essere ereditato e tutti i membri, le proprietà e i metodi sono statici / condivisi.


2
Ritiro il mio commento precedente. Stavo guardando un modulo nel riflettore e l'IL lo mostra come sigillato.
MagicKat

27
Sei un VBer? Un modulo è come uno spazio dei nomi. Tutte le funzioni VB vengono importate dai moduli VB e sono disponibili nell'ambito generale. A mio parere una classe statica in vb non è un modulo, ha un comportamento diverso. se vuoi il comportamento della 'classe statica' in vb, dovresti avere NotInheritable e dichiarare tutti i suoi membri 'Shared', proprio come dovresti fare nella classe statica di C #, si comporteranno LO STESSO. Un modulo NON.
Shimmy Weitzhandler

2
@ Shimmy Non so come mi sia sfuggito questo commento prima, ma ti sbagli. Guarda l'IL generato, ei moduli ottengono lo stesso identico trattamento della classe statica. Il VB fa solo un lavoro extra per le vecchie funzioni standard per farle apparire nell'ambito globale.
Joel Coehoorn

2
@JoelCoehoorn Module ≈≈ classe statica poiché un modulo deve essere dichiarato direttamente in uno spazio dei nomi. Ciò significa che non è possibile dichiarare un modulo in un modulo o in una classe.
LosManos

20
@JoelCoehoorn Il fatto che i moduli e le classi statiche finiscano con lo stesso IL è buono a sapersi, ma VB promuove inoltre i membri di un modulo nello spazio dei nomi che lo contiene. L' aspetto della promozione è dove i moduli e le classi statiche differiscono nell'uso pratico e IMHO è una differenza enorme. Preferisco di gran lunga la soluzione NotInheritable - costruttore privato vuoto - tutti i membri condivisi perché i membri possono essere raggiunti solo attraverso la classe, che è un comportamento molto più corretto se stai cercando di ottenere l'equivalenza della classe statica. L'IL potrebbe essere diverso, ma in realtà è accademico.
misha256

51

Quasi lì. Devi anche impedire la creazione di istanze.

NotInheritable Class MyStaticClass

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

    End Sub

    Public Shared Function MyMethod() As String

    End Function

End Class
  • Condiviso è come il metodo della classe statica.
  • NotInheritable è come sealed.
  • Private New è come se la classe statica non potesse essere istanziata.

Vedere:
MSDN - Classi statiche e membri di classi statiche


2
perché questa non è la risposta accettata? Grazie per il codice
ArcherBird

6

Se vuoi solo creare una classe che non puoi ereditare, in C # puoi usare Sealed e in VB.Net usare NotInheritable.

L'equivalente VB.Net di static è condiviso.


contrassegni le sue variabili e funzionalità come condivise, proprio come dovresti fare nella classe statica C #. Contrassegnare come Non ereditabile lo rende sigillato.
Shimmy Weitzhandler

5

Puoi creare una classe statica in vb.net. La soluzione è

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

La variabile AGE è statica pubblica, puoi usarla in altro codice proprio come questo

 Dim myage As Integer = DB.AGE

Amico = pubblico, NotInheritable = statico


3
Amico! = Pubblico, Amico = interno
Altair

1
NotInheritable! = Static, NotInheritable == sealed
Magnus

myage! = 20 (più, purtroppo)
Grim

2

Dal punto di vista di CLR, la classe statica C # è solo una classe "sigillata" e "astratta". Non puoi creare un'istanza, perché è astratta e non puoi ereditarla poiché è sigillata. Il resto è solo un po 'di magia del compilatore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.