在VB.NET中使用模块而不是带有共享成员函数的类是否被认为是可接受的做法?
我倾向于避免使用模块,因为他们感觉像是Visual Basic 6.0中剩下的剩余部分,并且似乎不再适合。另一方面,使用模块和仅具有共享成员的类似乎没有太大区别。我不是经常需要这么做,但有时会出现一些简单的解决方案。
我很想知道你是否有任何意见或偏好。
答案 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
替代Module
。 Module
有其自身的用途。 Class
的目的是用作
Class
或Module
中都不适合的变量。 Class
与Module
不同,因为你不能
Interface
,Module
,Module
Module
。 Module
内的任何内容都可以在Module
程序集中直接访问,而无需通过其名称引用Module
。默认情况下,Friend
的访问级别为{{1}}。
答案 4 :(得分:9)
<强>类强>
<强>模块强>
答案 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
在一个模块中以不同的顺序运行而不是一个类,只是去了事实上,我不得不从外部将一些声明移到内部方法中以避免错误。