É uma prática aceitável usar módulos em vez de classes com funções de membro compartilhado no VB.NET?
Eu costumo evitar os módulos, porque eles parecem restos do Visual Basic 6.0 e realmente não parecem mais se encaixar. Por outro lado, não parece haver muita diferença entre usar um módulo e uma classe apenas com membros compartilhados. Não é tão frequente que eu realmente tenha muita necessidade, mas às vezes há situações em que elas apresentam uma solução simples.
Estou curioso para saber se você tem alguma opinião ou preferência de uma forma ou de outra.
Private
qualificador. Em uma classe, o nível de proteção padrão é privado, o que pode ser um comportamento confuso, a menos que você esteja ciente disso.Respostas:
Module
s são equivalentes de VB parastatic
classes C # . Quando sua classe é projetada exclusivamente para funções auxiliares e métodos de extensão e você não deseja permitir herança e instanciação , use aModule
.A propósito, o uso
Module
não é realmente subjetivo e não é preterido . Na verdade, você deve usar umModule
quando for apropriado. O próprio .NET Framework faz isso várias vezes (System.Linq.Enumerable
por exemplo). Para declarar um método de extensão, é necessário usarModule
s.fonte
Eu acho que é uma boa ideia continuar evitando os módulos, a menos que você os cole em namespaces separados. Porque, no Intellisense, os métodos nos módulos serão visíveis de qualquer lugar nesse espaço para nome.
Então, em vez de
ModuleName.MyMethod()
você acabar comMyMethod()
pop - ups em qualquer lugar, isso invalida o encapsulamento. (pelo menos no nível de programação).É por isso que eu sempre tento criar Classe com métodos compartilhados, parece muito melhor.
fonte
Os módulos não são obsoletos e são muito usados na linguagem VB. É a única maneira, por exemplo, de implementar um método de extensão no VB.Net.
Há uma enorme diferença entre módulos e classes com membros estáticos. Qualquer método definido em um módulo é acessível globalmente, desde que o módulo esteja disponível no espaço para nome atual. De fato, um módulo permite definir métodos globais. Isso é algo que uma classe com apenas membros compartilhados não pode fazer.
Aqui está um exemplo rápido que eu uso muito ao escrever código VB que interage com interfaces COM brutas.
fonte
É aceitável usar
Module
.Module
não é usado como um substituto paraClass
.Module
serve a seu próprio propósito. O objetivoModule
é usar como recipiente paraClass
, ouClass
.Module
não é como umaClass
vez que você não podeModule
,Interface
com umModule
,Module
.Qualquer coisa dentro de a
Module
pode ser acessada diretamente dentro daModule
montagem sem se referir aoModule
nome. Por padrão, o nível de acesso para aModule
éFriend
.fonte
Aulas
Módulos
fonte
Quando uma das minhas classes do VB.NET possui todos os membros compartilhados, eu a converto em um Módulo com um namespace correspondente (ou apropriado) ou torno a classe não herdável e não construtível:
fonte
Imports <whatever>
se você tiver quaisquer importações,Namespace MyCoolModule
,Public Module MyCoolModule
, <membros semShared
>,End Module
,End Namespace
.Os módulos são bons para armazenar enumerações e algumas variáveis globais, constantes e funções compartilhadas. é muito bom e eu costumo usá-lo. Variáveis declaradas são visíveis em todo o projeto.
fonte
Você deve usar um módulo (em vez de uma classe) se estiver criando métodos de extensão. No VB.NET, não conheço outra opção.
Sendo resistente aos Módulos, passei algumas horas inúteis tentando descobrir como adicionar algum código padrão para resolver assemblies incorporados em um, apenas para descobrir que
Sub New()
(Módulo) eShared Sub New()
(Classe) são equivalentes. (Eu nem sabia que havia uma chamadaSub New()
em um módulo!)Então, eu só joguei o
EmbeddedAssembly.Load
eAddHandler AppDomain.CurrentDomain.AssemblyResolve
linhas lá e Bob tornou-se meu tio.Adendo : Eu ainda não fiz o check-out 100%, mas tenho uma impressão que
Sub New()
é executada em uma ordem diferente em um Módulo e em uma Classe, apenas pelo fato de que eu tive que mover algumas declarações para métodos internos de fora para evitar erros.fonte