¿Se considera una práctica aceptable usar módulos en lugar de clases con funciones de miembro compartidas en VB.NET?
Tiendo a evitar los módulos, porque sienten que quedan restos de Visual Basic 6.0 y realmente ya no parecen encajar. Por otro lado, no parece haber mucha diferencia entre usar un Módulo y una Clase con solo miembros Compartidos. No es tan frecuente que realmente tenga mucha necesidad, pero a veces hay situaciones en las que presentan una solución simple.
Tengo curiosidad por saber si tienes alguna opinión o preferencia de una forma u otra.
Private
calificador. En una clase, el nivel de protección predeterminado es privado, lo que puede ser un comportamiento confuso a menos que lo sepa.Respuestas:
Module
s son contrapartes de VB para lasstatic
clases de C # . Cuando su clase está diseñada exclusivamente para funciones auxiliares y métodos de extensión y no desea permitir la herencia y la creación de instancias , utiliza aModule
.Por cierto, el uso
Module
no es realmente subjetivo y no está en desuso . De hecho, debe usar unModule
cuando sea apropiado. .NET Framework lo hace muchas veces (System.Linq.Enumerable
por ejemplo). Para declarar un método de extensión, es necesario usarModule
s.fuente
Creo que es una buena idea seguir evitando módulos a menos que los pegue en espacios de nombres separados. Porque en Intellisense los métodos en los módulos serán visibles desde todas partes en ese espacio de nombres.
Entonces, en lugar de
ModuleName.MyMethod()
terminar conMyMethod()
ventanas emergentes en cualquier lugar, esto invalida la encapsulación. (al menos en el nivel de programación).Es por eso que siempre trato de crear Class con métodos compartidos, parece mucho mejor.
fuente
Los módulos de ninguna manera están en desuso y se usan mucho en el lenguaje VB. Es la única forma, por ejemplo, de implementar un método de extensión en VB.Net.
Hay una gran diferencia entre módulos y clases con miembros estáticos. Cualquier método definido en un Módulo es accesible globalmente siempre que el Módulo esté disponible en el espacio de nombres actual. En efecto, un módulo le permite definir métodos globales. Esto es algo que una clase con solo miembros compartidos no puede hacer.
Aquí hay un ejemplo rápido que uso mucho cuando escribo código VB que interopera con interfaces COM sin procesar.
fuente
Es aceptable de usar
Module
.Module
no se utiliza como un reemplazo paraClass
.Module
cumple su propio propósito. El propósito deModule
es usarlo como contenedor paraClass
, oClass
.Module
no es como unClass
ya que no puedesModule
,Interface
con unModule
,Module
.Module
Se puede acceder directamente a cualquier cosa dentro de a dentro delModule
ensamblaje sin hacer referencia alModule
nombre. Por defecto, el nivel de acceso para aModule
esFriend
.fuente
Clases
Módulos
fuente
Cuando una de mis clases de VB.NET tiene todos los miembros compartidos, la convierto en un Módulo con un espacio de nombres coincidente (o apropiado) o hago que la clase no sea heredable y no construible:
fuente
Imports <whatever>
si tiene cualquier importación,Namespace MyCoolModule
,Public Module MyCoolModule
, <miembros sinShared
>,End Module
,End Namespace
.Los módulos están bien para almacenar enumeraciones y algunas variables globales, constantes y funciones compartidas. es muy bueno y lo uso a menudo. Las variables declaradas son visibles en todo el proyecto.
fuente
Usted debe utilizar un módulo (en lugar de una clase) si va a crear métodos de extensión. En VB.NET no conozco otra opción.
Siendo resistente a los módulos, pasé un par de inútiles horas tratando de encontrar la manera de agregar un código repetitivo para resolver los ensamblados integrados en uno, solo para descubrir que
Sub New()
(Módulo) yShared Sub New()
(Clase) son equivalentes. (Ni siquiera sé que era un exigibleSub New()
en un módulo!)Así que acaba de lanzar el
EmbeddedAssembly.Load
yAddHandler AppDomain.CurrentDomain.AssemblyResolve
líneas de allí y Bob se convirtió en mi tío.Anexo : Todavía no lo he comprobado al 100%, pero tengo una idea que se
Sub New()
ejecuta en un orden diferente en un Módulo que en una Clase, solo por el hecho de que tuve que mover algunas declaraciones a métodos internos desde afuera para evitar erroresfuente