VB.NET中的类与模块

时间:2009-05-19 08:26:09

标签: vb.net

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

我倾向于避免使用模块,因为他们感觉像是Visual Basic 6.0中剩下的剩余部分,并且似乎不再适合。另一方面,使用模块和仅具有共享成员的类似乎没有太大区别。我不是经常需要这么做,但有时会出现一些简单的解决方案。

我很想知道你是否有任何意见或偏好。

8 个答案:

答案 0 :(得分:200)

Module是C#static类的VB对应物。如果您的课程仅针对辅助函数和扩展方法设计,而您想要允许继承实例化,则使用{{ 1}}。

顺便说一下,使用Module并不是主观的,并且不会弃用。实际上,您必须在适当时使用Module。 .NET Framework本身可以多次执行(例如Module)。要声明扩展方法,需要使用System.Linq.Enumerable s。

答案 1 :(得分:30)

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

因此,您可以在任何地方使用ModuleName.MyMethod()弹出窗口而不是MyMethod(),而这种封装会使封装无效。 (至少在编程层面)。

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

答案 2 :(得分:25)

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

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

这是一个快速的例子,我在编写与原始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

答案 3 :(得分:9)

使用Module是可以接受的。 Module不会用Class替代ModuleModule有其自身的用途。 Class的目的是用作

的容器
  • 扩展方法,
  • 非特定于任何Class
  • 的变量
  • 在任何Module中都不适合的变量。

ClassModule不同,因为你不能

  • 继承自Interface
  • 使用Module
  • 实施Module
  • 也不创建Module
  • 的实例

Module内的任何内容都可以在Module程序集中直接访问,而无需通过其名称引用Module。默认情况下,Friend的访问级别为{{1}}。

答案 4 :(得分:9)

<强>类

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

<强>模块

  • 模块无法实例化为对象,因为标准模块的数据只有一个副本,当程序的一部分更改标准模块中的公共变量时,它将会对整个计划都是可见的。
  • 默认情况下,模块中声明的成员可公开访问
  • 任何可以访问该模块的代码都可以访问它。
  • 这意味着标准模块中的变量实际上是全局变量,因为它们在项目的任何位置都是可见的,并且它们在程序的生命周期中存在。

答案 5 :(得分:6)

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

Public NotInheritable Class MyClass1

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

End Class

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

我自己对模块有抵触,我只花了几个小时试图找出如何添加一些样板代码来解析嵌入式程序集,只发现Sub New()(模块)和{{ 1}}(类)是等价的。 (我甚至不知道在模块中是一个可调用的Shared Sub New()!)

所以我只是把Sub New()EmbeddedAssembly.Load行放在那里,鲍勃成了我的叔叔。

附录:我还没有100%检查过它,但我有一个暗示AddHandler AppDomain.CurrentDomain.AssemblyResolve在一个模块中以不同的顺序运行而不是一个类,只是去了事实上,我不得不从外部将一些声明移到内部方法中以避免错误。