Marquage d'une classe statique dans VB.NET

85

Comme indiqué dans une question et réponse récente , vous ne pouvez pas hériter d'une classe statique. Comment appliquer les règles qui accompagnent les classes statiques dans VB.NET? Puisque le framework est compatible entre C # et VB, il serait logique qu'il y ait un moyen de marquer une classe statique, mais il ne semble pas y avoir de moyen.

MagicKat
la source

Réponses:

121

Module == classe statique

Si vous voulez juste une classe dont vous ne pouvez pas hériter, utilisez une NotInheritableclasse; mais ce ne sera pas statique / partagé. Vous pouvez marquer toutes les méthodes, propriétés et membres comme Shared, mais ce n'est pas strictement la même chose qu'une classe statique en C # car elle n'est pas appliquée par le compilateur.

Si vous voulez vraiment l'équivalent VB.Net d'une classe statique C #, utilisez un Module. Il ne peut pas être hérité et tous les membres, propriétés et méthodes sont statiques / partagés.

Joël Coehoorn
la source
2
Je retire mon commentaire précédent. Je regardais un module dans le réflecteur et l'IL le montre comme scellé.
MagicKat du
27
Êtes-vous un VBer? Un module est comme un espace de noms. Toutes les fonctions VB sont importées des modules de VB et elles sont disponibles dans la portée générale. À mon avis, une classe statique dans vb n'est pas un module, elle a un comportement différent. si vous voulez le comportement 'classe statique' dans vb, vous devriez avoir NotInheritable et déclarer tous ses membres 'Shared', tout comme vous auriez à le faire dans la classe statique de C #, ils se comporteront LE MÊME. Un module PAS.
Shimmy Weitzhandler
2
@Shimmy Je ne sais pas comment j'ai manqué ce commentaire avant, mais vous vous trompez. Regardez l'IL généré, et les modules reçoivent exactement le même traitement que la classe statique. Le VB fait juste un travail supplémentaire pour les anciennes fonctions standard pour les faire apparaître dans la portée globale.
Joel Coehoorn
2
@JoelCoehoorn Module ≈≈ classe statique car un module doit être déclaré directement dans un espace de noms. Cela signifie que l'on ne peut pas déclarer un module dans un module ou une classe.
LosManos
20
@JoelCoehoorn Le fait que les modules et les classes statiques finissent avec le même IL est bon à savoir, mais VB promeut également les membres d'un module vers l'espace de noms contenant. L' aspect promotion est là où les modules et les classes statiques diffèrent dans l'utilisation pratique et à mon humble avis, c'est une énorme différence. Je préfère de loin la solution NotInheritable - constructeur privé vide - tous les membres partagés car les membres ne peuvent être atteints que via la classe, ce qui est un comportement beaucoup plus correct si vous essayez d'obtenir une équivalence de classe statique. L'IL peut être différent, mais c'est vraiment académique.
misha256
51

Presque là. Vous devez également empêcher l'instanciation.

NotInheritable Class MyStaticClass

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

    End Sub

    Public Shared Function MyMethod() As String

    End Function

End Class
  • Shared est comme une méthode de classe statique.
  • NotInheritable est comme scellé.
  • Private New est comme une classe statique ne peut pas être instanciée.

Voir:
MSDN - Classes statiques et membres de classe statiques

Gary Newsom
la source
2
pourquoi n'est-ce pas la réponse acceptée? Merci pour le code
snip
6

Si vous souhaitez simplement créer une classe dont vous ne pouvez pas hériter, en C #, vous pouvez utiliser Sealed et en VB.Net, NotInheritable.

L'équivalent VB.Net de static est partagé.

Charles Graham
la source
vous marquez ses variables et ses fonctionnalités comme partagées, comme vous auriez à le faire dans une classe statique C #. Marquer comme NotInheritable le rend scellé.
Shimmy Weitzhandler
5

Vous pouvez créer une classe statique dans vb.net. La solution est

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

La variable AGE est publique statique, vous pouvez l'utiliser dans un autre code comme celui-ci

 Dim myage As Integer = DB.AGE

Friend = public, NotInheritable = static

Mentor
la source
3
Friend! = Public, Friend = internal
Altair
1
NotInheritable! = Static, NotInheritable == scellé
Magnus
myage! = 20 (plus, malheureusement)
Grim
2

Du point de vue CLR, la classe statique C # est simplement une classe «scellée» et «abstraite». Vous ne pouvez pas créer une instance, car elle est abstraite, et vous ne pouvez pas en hériter car elle est scellée. Le reste n'est que de la magie du compilateur.

Ilya Ryzhenkov
la source