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 uniquement des membres partagés. Ce n'est pas si souvent que j'ai vraiment besoin de l'un ou de l'autre, mais il y a parfois des situations où ils présentent une solution simple.
Je suis curieux de savoir si vous avez une opinion ou des préférences dans un sens ou dans l'autre.
Private
qualificatif. Dans une classe, le niveau de protection par défaut est privé, ce qui peut être un comportement déroutant à moins que vous n'en soyez conscient.Réponses:
Module
Les s sont des équivalents VB auxstatic
classes C # . Lorsque votre classe est conçue uniquement pour les fonctions d'assistance et les méthodes d'extension et que vous ne souhaitez pas autoriser l' héritage et l' instanciation , vous utilisez unModule
.Au fait, l'utilisation
Module
n'est pas vraiment subjective et n'est pas obsolète . En effet, vous devez utiliser unModule
lorsque 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 d'utiliserModule
s.la source
Je pense que c'est une bonne idée de continuer à éviter les modules à moins de les coller dans des espaces de noms séparés. Parce que dans Intellisense, les méthodes des modules seront visibles de partout dans cet espace de noms.
Donc au lieu de
ModuleName.MyMethod()
vous vous retrouvez avec desMyMethod()
popups n'importe où et ce genre d'invalidité de 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, cela semble tellement mieux.
la source
Les modules ne sont en aucun cas obsolètes et sont largement 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 existe 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 uniquement des membres partagés ne peut pas faire.
Voici un exemple rapide que j'utilise beaucoup lors de l'écriture de code VB qui interagit avec les interfaces COM brutes.
la source
Il est acceptable d'utiliser
Module
.Module
n'est pas utilisé en remplacement deClass
.Module
sert son propre objectif. Le but deModule
est d'utiliser comme conteneur pourClass
, ouClass
.Module
n'est pas comme unClass
puisque vous ne pouvez pasModule
,Interface
avec unModule
,Module
.Tout ce qui se trouve à l'intérieur d'un
Module
est accessible directement dans l'Module
assemblage sans faire référence auModule
par son nom. Par défaut, le niveau d'accès pour aModule
estFriend
.la source
Des classes
Modules
la source
Quand l'une de mes classes VB.NET a tous les membres partagés, je la convertis en un module avec un espace de noms correspondant (ou autrement approprié) ou je rend la classe non héritable et non constructible:
la source
Imports <whatever>
si vous avez des importations,Namespace MyCoolModule
,Public Module MyCoolModule
, <membres sansShared
>,End Module
,End Namespace
.Les modules sont parfaits pour stocker des énumérations et certaines variables globales, constantes et fonctions partagées. sa très bonne chose et je l'utilise souvent. Les variables déclarées sont visibles sur l'ensemble du projet.
la source
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, pour découvrir que
Sub New()
(Module) etShared Sub New()
(Class) sont équivalents. (Je ne savais même pas qu'il y avait un appelableSub New()
dans un module!)Donc , je viens de jeter les
EmbeddedAssembly.Load
etAddHandler AppDomain.CurrentDomain.AssemblyResolve
lignes là - bas et Bob est devenu mon oncle.Addendum : Je ne l'ai pas encore vérifié à 100%, mais j'ai une idée qui
Sub New()
s'exécute dans un ordre différent dans un module d'une classe, en passant simplement par le fait que j'ai dû déplacer certaines déclarations vers des méthodes internes de l'extérieur pour éviter les erreurs.la source