Marcando una clase como estática en VB.NET

85

Como se acaba de indicar en una pregunta y respuesta reciente , no puede heredar de una clase estática. ¿Cómo se hacen cumplir las reglas que acompañan a las clases estáticas dentro de VB.NET? Dado que el marco es compatible entre C # y VB, tendría sentido que hubiera una forma de marcar una clase como estática, pero no parece haber una forma.

MagicKat
fuente

Respuestas:

121

Módulo == clase estática

Si solo desea una clase que no pueda heredar, use una NotInheritableclase; pero no será estático / compartido. Puede marcar todos los métodos, propiedades y miembros como Shared, pero eso no es estrictamente lo mismo que una clase estática en C #, ya que el compilador no la impone.

Si realmente desea el equivalente de VB.Net a una clase estática de C #, use a Module. No se puede heredar y todos los miembros, propiedades y métodos son estáticos / compartidos.

Joel Coehoorn
fuente
2
Me retracto de mi comentario anterior. Estaba mirando un módulo en reflector y el IL lo muestra como sellado.
MagicKat
27
¿Eres VBer? Un módulo es como un espacio de nombres. Todas las funciones de VB se importan de los módulos de VB y están disponibles en el alcance general. En mi opinión, una clase estática en vb no es un módulo, tiene un comportamiento diferente. si desea el comportamiento de 'clase estática' en vb, debe tener NotInheritable y declarar todos sus miembros como 'Compartidos', tal como lo haría en la clase estática de C #, se comportarán DE LA MISMA. Un módulo NO.
Shimmy Weitzhandler
2
@Shimmy No sé cómo me he perdido este comentario antes, pero estás equivocado. Mire el IL generado y los módulos reciben exactamente el mismo tratamiento que la clase estática. El VB solo hace un trabajo adicional para las funciones estándar antiguas para que aparezcan en el ámbito global.
Joel Coehoorn
2
@JoelCoehoorn Module ≈≈ clase estática ya que un módulo debe declararse directamente en un espacio de nombres. Esto significa que no se puede declarar un Módulo en un Módulo o Clase.
LosManos
20
@JoelCoehoorn Es bueno saber el hecho de que los módulos y las clases estáticas terminan con el mismo IL, pero VB además promueve los miembros de un módulo al espacio de nombres que los contiene. El aspecto de la promoción es donde los módulos y las clases estáticas difieren en el uso práctico y, en mi humilde opinión, esa es una gran diferencia. Prefiero la solución NotInheritable - constructor privado vacío - todos los miembros compartidos porque solo se puede acceder a los miembros a través de la clase, que es un comportamiento mucho más correcto si está tratando de obtener una equivalencia de clase estática. El IL puede ser diferente, pero eso es realmente académico.
misha256
51

Casi ahí. También debe evitar la creación de instancias.

NotInheritable Class MyStaticClass

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

    End Sub

    Public Shared Function MyMethod() As String

    End Function

End Class
  • Shared es como un método de clase estática.
  • NotInheritable es como sellado.
  • Private New es como una clase estática que no se puede instanciar.

Consulte:
MSDN: clases estáticas y miembros de clase estática

Gary Newsom
fuente
2
¿Por qué esta no es la respuesta aceptada? Gracias por el recorte de código
ArcherBird
6

Si solo desea crear una clase que no puede heredar, en C # puede usar Sealed y en VB.Net use NotInheritable.

Se comparte el equivalente VB.Net de static.

Charles Graham
fuente
usted marca sus variables y funcionalidades como compartidas, tal como lo haría en la clase estática de C #. Marcar como No heredable lo hace sellado.
Shimmy Weitzhandler
5

Puede crear una clase estática en vb.net. La solucion es

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

La variable AGE es estática pública, puede usarla en otro código como este

 Dim myage As Integer = DB.AGE

Amigo = público, No heredable = estático

Mentor
fuente
3
Amigo! = Público, Amigo = interno
Altair
1
NotInheritable! = Estático, NotInheritable == sellado
Magnus
myage! = 20 (más, tristemente)
Grim
2

Desde el punto de vista de CLR, la clase estática de C # es simplemente una clase "sellada" y "abstracta". No puede crear una instancia porque es abstracta y no puede heredar de ella porque está sellada. El resto es solo magia del compilador.

Ilya Ryzhenkov
fuente