Markieren einer statischen Klasse in VB.NET

85

Wie bereits in einer aktuellen Frage und Antwort erwähnt , können Sie nicht von einer statischen Klasse erben. Wie erzwingt man die Regeln, die mit statischen Klassen in VB.NET einhergehen? Da das Framework zwischen C # und VB kompatibel ist, wäre es sinnvoll, eine Klasse als statisch zu markieren, aber es scheint keine Möglichkeit zu geben.

MagicKat
quelle

Antworten:

119

Modul == statische Klasse

Wenn Sie nur eine Klasse möchten, die Sie nicht erben können, verwenden Sie eine NotInheritableKlasse. aber es wird nicht statisch / geteilt sein. Sie können alle Methoden, Eigenschaften und Elemente als markieren Shared, aber das ist nicht unbedingt dasselbe wie eine statische Klasse in C #, da sie vom Compiler nicht erzwungen wird.

Wenn Sie wirklich möchten, dass das VB.Net einer statischen C # -Klasse entspricht, verwenden Sie a Module. Es kann nicht vererbt werden und alle Mitglieder, Eigenschaften und Methoden sind statisch / gemeinsam genutzt.

Joel Coehoorn
quelle
2
Ich ziehe meinen vorherigen Kommentar zurück. Ich habe mir ein Modul im Reflektor angesehen und die IL zeigt es als versiegelt.
MagicKat
26
Bist du ein VBer? Ein Modul ist wie ein Namespace. Alle VB-Funktionen werden aus den VB-Modulen importiert und sind im allgemeinen Umfang verfügbar. Meiner Meinung nach ist eine statische Klasse in vb kein Modul, sie hat ein anderes Verhalten. Wenn Sie das Verhalten der 'statischen Klasse' in vb möchten, sollten Sie NotInheritable haben und alle Mitglieder als 'Shared' deklarieren, genau wie Sie es in der statischen Klasse von C # tun müssten, sie verhalten sich gleich. Ein Modul NICHT.
Shimmy Weitzhandler
2
@Shimmy Ich weiß nicht, wie ich diesen Kommentar zuvor verpasst habe, aber du liegst falsch. Schauen Sie sich die generierte IL an, und Module erhalten genau die gleiche Behandlung wie statische Klassen. Der VB erledigt nur zusätzliche Arbeit für die alten Standardfunktionen, damit sie im globalen Bereich angezeigt werden.
Joel Coehoorn
2
@JoelCoehoorn Module ≈≈ statische Klasse, da ein Modul direkt in einem Namespace deklariert werden muss. Dies bedeutet, dass man kein Modul in einem Modul oder einer Klasse deklarieren kann.
LosManos
19
@JoelCoehoorn Die Tatsache, dass Module und statische Klassen dieselbe IL haben, ist gut zu wissen, aber VB befördert die Mitglieder eines Moduls zusätzlich in den enthaltenen Namespace. Der Promotion- Aspekt besteht darin, dass sich Module und statische Klassen im praktischen Gebrauch unterscheiden, und meiner Meinung nach ist dies ein massiver Unterschied. Ich bevorzuge bei weitem die gemeinsam genutzte Lösung NotInheritable - leerer privater Konstruktor - für alle Mitglieder , da Mitglieder nur über die Klasse erreicht werden können. Dies ist weitaus korrekter, wenn Sie versuchen, eine statische Klassenäquivalenz zu erhalten. Die IL mag anders sein, aber das ist wirklich akademisch.
Mischa256
50

Fast dort. Sie müssen auch die Instanziierung verhindern.

NotInheritable Class MyStaticClass

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

    End Sub

    Public Shared Function MyMethod() As String

    End Function

End Class
  • Shared ist wie eine Methode der statischen Klasse.
  • NotInheritable ist wie versiegelt.
  • Private New ist wie statische Klasse kann nicht instanziiert werden.

Siehe:
MSDN - Statische Klassen und statische Klassenmitglieder

Gary Newsom
quelle
1
Warum ist dies nicht die akzeptierte Antwort? Vielen Dank für den Code snip
ArcherBird
6

Wenn Sie nur eine Klasse erstellen möchten, die Sie nicht erben können, können Sie in C # Sealed und in VB.Net NotInheritable verwenden.

Das VB.Net-Äquivalent von static wird gemeinsam genutzt.

Charles Graham
quelle
Sie markieren die Variablen und Funktionen als gemeinsam genutzt, genau wie Sie es in der statischen C # -Klasse tun müssten. Durch Markieren als nicht vererbbar wird es versiegelt.
Shimmy Weitzhandler
5

Sie können eine statische Klasse in vb.net erstellen. Die Lösung ist

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

Die AGE-Variable ist öffentlich statisch. Sie können sie auch in diesem Code verwenden

 Dim myage As Integer = DB.AGE

Freund = öffentlich, nicht vererbbar = statisch

Mentor
quelle
3
Freund! = Öffentlich, Freund = intern
Altair
1
NotInheritable! = Statisch, NotInheritable == versiegelt
Magnus
myage! = 20 (leider nicht mehr)
Grim
2

Aus Sicht der CLR ist die statische C # -Klasse nur eine "versiegelte" und eine "abstrakte" Klasse. Sie können eine Instanz nicht erstellen, da sie abstrakt ist und Sie sie nicht erben können, da sie versiegelt ist. Der Rest ist nur ein bisschen Compiler-Magie.

Ilya Ryzhenkov
quelle