Answers:
Module
与C#static
类的VB对应。当你的类仅设计用于辅助功能和扩展方法,你不希望允许继承和实例,您可以使用Module
。
顺便说一句,使用Module
并不是真正的主观,也不是不推荐使用。确实,您必须Module
在适当的时候使用a 。.NET Framework本身可以执行多次(System.Linq.Enumerable
例如)。要声明扩展方法,需要使用Module
。
我认为最好避免使用模块,除非您将模块粘贴到单独的命名空间中。因为在Intellisense中,模块的方法将在该命名空间的任何位置可见。
因此,不是ModuleName.MyMethod()
您最终会MyMethod()
在任何地方出现弹出窗口,而是这种封装无效。(至少在编程级别上)。
这就是为什么我总是尝试使用共享方法创建Class的原因,看起来好多了。
绝不弃用模块,并且在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
可以使用Module
。Module
不能代替Class
。Module
达到自己的目的。的目的Module
是用作容器
Class
,或Class
。Module
不像一个,Class
因为你不能
Module
,Interface
了Module
,Module
。a内的任何内容Module
都可以直接在Module
程序集中访问,而无需Module
通过其名称引用。默认情况下,对于一个访问级别Module
是Friend
。
当我的VB.NET类之一具有所有共享成员时,我要么将其转换为具有匹配(或其他适当方式)名称空间的Module,要么使该类不可继承且不可构造:
Public NotInheritable Class MyClass1
Private Sub New()
'Contains only shared members.
'Private constructor means the class cannot be instantiated.
End Sub
End Class
Imports <whatever>
如果您有任何进口Namespace MyCoolModule
,Public Module MyCoolModule
,<成员无 Shared
>, ,。End Module
End Namespace
你必须,如果你正在创建扩展方法使用一个模块(而不是类)。在VB.NET中,我不知道其他选择。
我本人对模块有抵触性,我花了几个小时的时间试图弄清楚如何添加一些样板代码来解析嵌入式程序集,却发现Sub New()
(Module)和Shared Sub New()
(Class)是等效的。(我甚至不知道有是一个可调用Sub New()
的模块!)
因此,我只是把EmbeddedAssembly.Load
和扔进AddHandler AppDomain.CurrentDomain.AssemblyResolve
去,鲍勃成了我的叔叔。
附录:我还没有100%签出它,但是我有一个Sub New()
在模块中以与类不同的顺序运行的标记,只是因为我不得不从外部将一些声明移到内部方法以避免这种情况错误。
Private
限定符,可能会无意间使方法可用。在一个类中,默认保护级别是私有的,除非您不了解,否则它可能会使行为混乱。