VB.NET中的类与模块

在VB.NET中使用模块而不是带有共享成员函数的类是否被认为是可接受的做法?

我倾向于避免使用模块,因为他们感觉像从Visual Basic 6.0剩下的遗留物,而且看起来不再适合。 另一方面,使用一个模块和一个类只有共享成员似乎没有太大的区别。 我并不是经常需要这么多,但是有时他们会提出一个简单的解决scheme。

我很好奇听到你是否有任何意见或偏好。

Module是VB对应于C# static类的对象。 当你的类只是为辅助函数和扩展方法而devise的,而你不想允许inheritance实例化的时候 ,你可以使用一个Module

顺便说一句,使用Module不是真的主观,它不被弃用 。 事实上,您必须在适当的时候使用Module 。 .NET框架本身做了很多次(例如System.Linq.Enumerable )。 要声明扩展方法,需要使用Module

我认为避免模块是一个好主意,除非你把它们放在单独的命名空间中。 因为在模块中的Intellisense方法将从该名称空间的任何地方可见。

所以,而不是ModuleName.MyMethod()你最终与MyMethod()popup在任何地方,这种无效的封装。 (至less在编程级别)。

这就是为什么我总是尝试使用共享方法创buildClass,看起来好多了。

模块绝不被弃用,并且在VB语言中被大量使用。 这是在VB.Net中实现扩展方法的唯一方法。

模块和类与静态成员之间有一个巨大的差异。 只要Module在当前命名空间中可用,任何在Module上定义的方法都是全局可访问的。 实际上,模块允许您定义全局方法。 这是一个只有共享成员不能做的类。

下面是一个简单的例子,我写了一些与原始的COM接口相互作用的VB代码。

 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 

使用Module是可以接受的。 Module不能用作Class的替代品。 Module服务于自己的目的。 Module的目的是作为一个容器来使用

  • 扩展方法,
  • 不是特定于任何Classvariables,或者
  • 在任何Class都不适合的variables。

Module不像一个Class因为你不能

  • Moduleinheritance,
  • Module实现一个Interface
  • 也不创buildModule的实例。

Module内的任何东西都可以在Module组件中直接访问,而不必通过Module的名称来引用Module 。 默认情况下, Module的访问级别为“ Friend

  • 类可以被实例化为对象
  • 对象数据分别存在于每个实例化对象中。
  • 类可以实现接口
  • 在类中定义的成员在类的特定实例作用域,并且仅在对象生命周期中存在。
  • 要从类外部访问类成员,必须使用Object.Member格式的完全限定名

模块

  • 模块不能被实例化为对象 ,因为只有一个标准模块数据的副本,当你的程序的一部分改变了标准模块中的一个公共variables时,
  • 在模块中声明的成员默认是可公开访问的。
  • 它可以通过任何可以访问模块的代码访问。
  • 这意味着标准模块中的variables实际上是全局variables,因为它们在项目中的任何位置都是可见的,并且在程序的整个生命周期中都是存在的。

当我的一个VB.NET类拥有所有的共享成员时,我将其转换为具有匹配(或其他适当的)名称空间的模块,或者使该类不可inheritance且不可构造:

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

模块可以存储枚举和一些全局variables,常量和共享函数。 它是非常好的东西,我经常使用它。 声明的variables是整个项目可见的acros。

如果您正在创build扩展方法,则必须使用模块(而不是类)。 在VB.NET中,我不知道另一种select。

为了解决这个问题,我只花了几个小时,试图找出如何添加一些样板代码来解决一个embedded式程序集,只是为了找出Sub New() (Module)和Shared Sub New() (类)是等价的。 (我甚至不知道模块中有一个可调用的Sub New() !)

所以我只是扔在那里的EmbeddedAssembly.LoadAddHandler AppDomain.CurrentDomain.AssemblyResolve行,鲍勃成为我的叔叔。

附录 :我还没有100%的检查出来,但我有一个暗示Sub New()在一个模块中运行顺序不同于一个类,只是由于我必须将一些声明移动到内部方法从外面避免错误。

VB.NET相当于静态的是Shared。 函数可以像:

 Public Shared Sub AddCacheDataTable() Return whatever End Sub