我得到了一个Utility模块,因为VB.NET没有像C#那样的静态类,模块是VB.NET中的静态类,我使用模块的原因是因为我使用的是扩展方法,它只能在模块中使用。
我不能引用这个模块,但是如果我把我的代码放在一个类中。我可以毫不费力地参考它。可能的原因是什么?我想C#了。
编辑:模块在调用Utility的类库中。
发布于 2009-01-12 19:18:57
我不能引用这个模块,但是如果我把我的代码放在一个类中。我可以毫不费力地参考它。有人知道为什么吗?
因为VB中的模块不是类,不能用来实例化对象。相反,它们类似于名称空间,不同之处在于名称空间不能直接包含函数。所以使用模块的原因是提供了一种对不属于某个类的函数进行逻辑分组的方法。
当您考虑到并非所有东西在逻辑上都属于一个类时,这就很有意义了。以System.Math为例。除了一种奇怪的OOP纯粹主义之外,完全没有理由让它成为一个类。
顺便说一下,您也不能在C#中引用静态类,至少如果我正确理解您所说的“引用”是什么意思的话。也许你可以澄清这一点。
发布于 2009-01-12 19:45:55
您需要将该模块标记为公共模块。
发布于 2009-01-13 07:12:53
.NET编译器可以采用任何类型的语言语法,并将其转换为.NET等效项。有时会有一对一的通信,其他时候则没有。
通过使用.NET Reflector,您可以看到编译器真正在做什么。
在VB.NET中,该模块之所以存在,是因为继承自Visual BASIC,部分继承自Microsoft BASIC。
VB.NET编译器将接受以下内容
Public Module CoreModule
Dim R As New System.Random(CInt(Microsoft.VisualBasic.Timer))
Public Function D(ByVal Roll As Integer) As Integer
Return R.Next(0, Roll) + 1
End Function
Public Function _1D6() As Integer
Return D(6)
End Function
Public Function _2D6() As Integer
Return D(6) + D(6)
End Function
Public Function _3D6() As Integer
Return D(6) + D(6) + D(6)
End Function
Public Function _4D6() As Integer
Return D(6) + D(6) + D(6) + D(6)
End Function
Public Function CRLF() As String
Return Microsoft.VisualBasic.ControlChars.CrLf
End Function
End Module并将其转换成这样(为简洁起见,省略了代码)
Public NotInheritable Class CoreModule
' Methods
Shared Sub New()
Public Shared Function _1D6() As Integer
Public Shared Function _2D6() As Integer
Public Shared Function _3D6() As Integer
Public Shared Function _4D6() As Integer
Public Shared Function CRLF() As String
Public Shared Function D(ByVal Roll As Integer) As Integer
' Fields
Private Shared R As Random
End Class在C#中,等效项是
public sealed class CoreModule
{
// Fields
private static Random R;
// Methods
static CoreModule();
public static int _1D6();
public static int _2D6();
public static int _3D6();
public static int _4D6();
public static string CRLF();
public static int D(int Roll);
}重要的是发出的CIL是否正确地完成了工作。
这种能力是为什么许多老的Visual basic6程序员对微软对该语言的更改感到非常恼火的主要原因。例如,关键字Integer发出Int32而不是Int16。
只要模块声明为公共模块,模块就会向引用原始程序集的其他程序集公开。
https://stackoverflow.com/questions/436605
复制相似问题