Clases vs Módulos en VB.NET


¿Se considera una práctica aceptable usar Módulos en lugar de Clases con funciones miembro compartidas en VB.NET?

Tiendo a evitar los módulos, porque se sienten como restos de Visual Basic 6.0 y realmente no parecen encajar más. Por otro lado, no parece haber mucha diferencia entre usar un Módulo y una Clase con solo miembros compartidos. No es tan a menudo que realmente tengo mucha necesidad de cualquiera, pero a veces hay situaciones en las que se presentan una solución simple.

Tengo curiosidad por saber si tiene alguna opinión o preferencias de una manera u otra.

 145
Author: Peter Mortensen, 2009-05-19

8 answers

Modules son contrapartes VB de las clases C# static. Cuando tu clase está diseñada únicamente para funciones auxiliares y métodos de extensión y no quieres permitir herencia y instanciación, usas un Module.

Por cierto, usar Module no es realmente subjetivo y no está en desuso. De hecho, debe usar un Module cuando sea apropiado. . NET Framework lo hace muchas veces (System.Linq.Enumerable, por ejemplo). Para declarar un método de extensión, es necesario use Module s.

 192
Author: Mehrdad Afshari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-19 14:27:28

Creo que es una buena idea seguir evitando los módulos a menos que los pegue en espacios de nombres separados. Porque en Intellisense los métodos en módulos serán visibles desde todas partes en ese espacio de nombres.

Así que en lugar de ModuleName.MyMethod() terminas con MyMethod() ventanas emergentes en cualquier lugar y este tipo de invalida la encapsulación. (al menos en el nivel de programación).

Es por eso que siempre trato de crear Clase con métodos compartidos, parece mucho mejor.

 27
Author: dr. evil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-19 08:38:51

Los módulos no están en desuso y se usan mucho en el lenguaje VB. Es la única manera, 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 al escribir código VB que interactúa con interfaces COM raw.

Module Interop
  Public Function Succeeded(ByVal hr as Integer) As Boolean
    ...
  End Function

  Public Function Failed(ByVal hr As Integer) As Boolean
    ...
  End Function
End Module

Class SomeClass
  Sub Foo()
    Dim hr = CallSomeHrMethod()
    if Succeeded(hr) then
      ..
    End If
  End Sub
End Class
 23
Author: JaredPar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-19 14:21:10

Es aceptable usar Module. Module no sustituye a Class. Module sirve a su propio propósito. El propósito de Module es utilizar como un contenedor para

  • métodos de extensión,
  • variables que no son específicas de ningún Class, o
  • variables que no encajan correctamente en ningún Class.

Module no es como un Class, ya que no puede

  • heredar de un Module,
  • implementar un Interface con un Module,
  • ni crear una instancia de a Module.

Cualquier cosa dentro de un Module puede ser accedida directamente dentro del ensamblado Module sin referirse al Module por su nombre. Por defecto, el nivel de acceso para un Module es Friend.

 9
Author: Chandra Malla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-24 17:52:59

Clases

  • las clases pueden ser instanciadas como objetos
  • Los datos del objeto existen por separado para cada objeto instanciado.
  • las clases pueden implementar interfaces.
  • Los miembros definidos dentro de una clase tienen un ámbito dentro de una instancia específica de la clase y solo existen durante el tiempo de vida del objeto.
  • Para acceder a miembros de clase desde fuera de una clase, debe usar nombres completos en el formato de Objeto.Miembro.

Módulos

  • Modules no se pueden crear instancias como objetos , porque solo hay una copia de los datos de un módulo estándar, cuando una parte de su programa cambia una variable pública en un módulo estándar, será visible para todo el programa.
  • Los miembros declarados dentro de un módulo son de acceso público por defecto.
  • Se puede acceder por cualquier código que pueda acceder al módulo.
  • Esto significa que las variables en un módulo estándar son efectivamente variables globales porque son visibles desde cualquier lugar de su proyecto, y existen durante la vida del programa.
 8
Author: Suji,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-25 04:52:49

Cuando uno de mis VB.NET classes tiene todos los miembros compartidos Lo convierto en un Módulo con un espacio de nombres coincidente (o apropiado) o hago que la clase no sea heredable y no se pueda construir:

Public NotInheritable Class MyClass1

   Private Sub New()
      'Contains only shared members.
      'Private constructor means the class cannot be instantiated.
   End Sub

End Class
 6
Author: JRS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-11 21:53:17

Los módulos están bien para almacenar enumeraciones y algunas variables globales, constantes y funciones compartidas. es algo muy bueno y lo uso a menudo. Las variables declaradas son visibles acros todo el proyecto.

 0
Author: GGSoft,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-11 10:32:12

debe usar un Módulo (en lugar de una Clase) si está creando métodos de extensión. En VB.NET No conozco otra opción.

Siendo resistente a los Módulos yo mismo, acabo de pasar un par de horas sin valor tratando de averiguar cómo agregar algún código repetitivo para resolver ensamblajes incrustados en uno, solo para descubrir que Sub New() (Módulo) y Shared Sub New() (Clase) son equivalentes. (¡ Ni siquiera sabía que había un Sub New() llamable en un Módulo!)

Así que acabo de lanzar el EmbeddedAssembly.Load y AddHandler AppDomain.CurrentDomain.AssemblyResolve líneas allí y Bob se convirtió en mi tío.

Addendum : Todavía no lo he comprobado al 100%, pero tengo una idea de que Sub New() se ejecuta en un orden diferente en un Módulo que en una Clase, simplemente por el hecho de que tuve que mover algunas declaraciones a métodos internos desde afuera para evitar errores.

 0
Author: SteveCinq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-04 06:10:49