Classes vs Modules dans VB.NET

Est-il considéré comme une pratique acceptable d'utiliser des Modules au lieu de Classes avec des fonctions membres partagées dans VB.NET?

J'ai tendance à éviter les Modules, car ils ont l'impression que les restes de Visual Basic 6.0 ne semblent plus vraiment s'intégrer. D'un autre côté, il ne semble pas y avoir beaucoup de différence entre l'utilisation d'un Module et D'une classe avec seulement des membres partagés. Ce n'est pas souvent que j'ai vraiment beaucoup besoin de l'un ou l'autre, mais parfois il y a des situations où ils présentent une solution simple.

Je suis curieux de savoir si vous avez une opinion ou des préférences d'une manière ou d'une autre.

145
demandé sur Peter Mortensen 2009-05-19 12:26:09

8 réponses

Modules sont des homologues VB aux classes C # static. Lorsque votre classe est conçu uniquement pour des fonctions d'assistance et les méthodes de vulgarisation et de vous n'est pas voulez autoriser héritage et instanciation, vous utilisez un Module.

En passant, utiliser Module n'est pas vraiment subjectif et ce n'est pas obsolète. En effet, vous devez utiliser un Module quand c'est approprié. . NET Framework lui-même le fait plusieurs fois (System.Linq.Enumerable, par exemple). Pour déclarer une méthode d'extension, il est nécessaire de utilisez Module S.

192
répondu Mehrdad Afshari 2009-05-19 14:27:28

Je pense que c'est une bonne idée de continuer à éviter les modules sauf si vous les collez dans des espaces de noms séparés. Parce que dans Intellisense les méthodes dans les modules seront visibles de partout dans cet espace de noms.

Donc, au lieu de ModuleName.MyMethod() Vous vous retrouvez avec MyMethod() popups dans n'importe où et ce genre d'invalide l'encapsulation. (au moins au niveau de la programmation).

C'est pourquoi j'essaie toujours de créer une Classe avec des méthodes partagées, semble tellement mieux.

27
répondu dr. evil 2009-05-19 08:38:51

Les Modules ne sont en aucun cas obsolètes et sont fortement utilisés dans le langage VB. C'est le seul moyen par exemple d'implémenter une méthode d'extension dans VB.Net.

Il y a une énorme différence entre les Modules et les Classes avec des membres statiques. Toute méthode définie sur un Module est globalement accessible tant que le Module est disponible dans l'espace de noms actuel. En effet un Module vous permet de définir des méthodes globales. C'est quelque chose qu'une classe avec seulement des membres partagés ne peut pas faire.

Voici un exemple rapide que j'utilise beaucoup lors de l'écriture de code VB qui interops avec des interfaces COM brutes.

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
répondu JaredPar 2009-05-19 14:21:10

, Il est acceptable d'utiliser Module. Module n'est pas utilisé en remplacement de Class. Module sert son propre but. Le but de Module est d'utiliser comme conteneur pour

  • méthodes d'extension,
  • variables qui ne sont spécifiques à aucun Class, ou
  • variables qui ne correspondent pas correctement à tout Class.

Module ce n'est pas comme un Class puisque vous ne pouvez pas

  • hériter d'un Module,
  • mettre en œuvre un Interface avec Module,
  • ni créer une instance de Module.

Tout ce qui se trouve dans un Module peut être directement accessible dans l'assembly Module sans faire référence au Module par son nom. Par défaut, le niveau d'accès pour un Module est Friend.

9
répondu Chandra Malla 2014-04-24 17:52:59

Les Classes

  • classes peuvent être instancié comme objets
  • les données D'objet existent séparément pour chaque objet instancié.
  • Les classes peuvent implémenter des interfaces .
  • les membres définis dans une classe sont étendus dans une instance spécifique de la classe et n'existent que pour la durée de vie de l'objet.
  • pour accéder aux membres d'une classe depuis l'extérieur d'une classe, vous devez utiliser noms complets au format de objet.Membre .

Les Modules

  • les Modules ne peuvent pas être instanciés en tant qu'objets, car il n'y a qu'une seule copie des données d'un module standard, lorsqu'une partie de votre programme modifie une variable publique dans un module standard, elle sera visible pour l'ensemble du programme.
  • les membres déclarés dans un module sont accessibles au public par défaut.
  • il est accessible par n'importe quel code qui peut accéder au module.
  • Cela signifie que les variables d'un module standard sont effectivement des variables globales car elles sont visibles de n'importe où dans votre projet, et elles existent pour la durée de vie du programme.
8
répondu Suji 2018-01-25 04:52:49

Quand l'un de mes VB.NET classes a tous les membres partagés je le convertit en un Module avec un espace de noms correspondant (ou autrement approprié) ou je rends la classe non héritable et non constructible:

Public NotInheritable Class MyClass1

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

End Class
6
répondu JRS 2011-03-11 21:53:17

Les Modules sont parfaits pour stocker des énumérations et certaines variables globales, constantes et fonctions partagées. c'est très bonne chose et je l'utilise souvent. Les variables déclarées sont visibles Acros ensemble du projet.

0
répondu GGSoft 2017-04-11 10:32:12

Vous devez utiliser un Module (plutôt qu'une classe) si vous créez des méthodes D'Extension. Dans VB.NET Je ne suis pas au courant d'une autre option.

Étant moi-même résistant aux Modules, je viens de passer quelques heures sans valeur à essayer de trouver comment ajouter du code standard pour résoudre les assemblages intégrés en un seul, seulement pour découvrir que Sub New() (Module) et Shared Sub New() (Classe) sont équivalents. (Je ne savais même pas qu'il y avait {[8] } un appelable Sub New() dans un Module!)

Donc je viens de jeter le EmbeddedAssembly.Load et AddHandler AppDomain.CurrentDomain.AssemblyResolve lignes là-dedans et Bob est devenu mon oncle.

Addendum : Je ne l'ai pas encore vérifié à 100%, mais j'ai une idée que Sub New() s'exécute dans un ordre différent dans un Module qu'une classe, juste en fonction du fait que j'ai dû déplacer certaines déclarations vers des méthodes internes de l'extérieur pour éviter les erreurs.

0
répondu SteveCinq 2017-10-04 06:10:49