首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >VB.NET:如何引用VB.NET模块?

VB.NET:如何引用VB.NET模块?
EN

Stack Overflow用户
提问于 2009-01-12 19:13:35
回答 6查看 62.2K关注 0票数 20

我得到了一个Utility模块,因为VB.NET没有像C#那样的静态类,模块是VB.NET中的静态类,我使用模块的原因是因为我使用的是扩展方法,它只能在模块中使用。

我不能引用这个模块,但是如果我把我的代码放在一个类中。我可以毫不费力地参考它。可能的原因是什么?我想C#了。

编辑:模块在调用Utility的类库中。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-01-12 19:18:57

我不能引用这个模块,但是如果我把我的代码放在一个类中。我可以毫不费力地参考它。有人知道为什么吗?

因为VB中的模块不是类,不能用来实例化对象。相反,它们类似于名称空间,不同之处在于名称空间不能直接包含函数。所以使用模块的原因是提供了一种对不属于某个类的函数进行逻辑分组的方法。

当您考虑到并非所有东西在逻辑上都属于一个类时,这就很有意义了。以System.Math为例。除了一种奇怪的OOP纯粹主义之外,完全没有理由让它成为一个类。

顺便说一下,您也不能在C#中引用静态类,至少如果我正确理解您所说的“引用”是什么意思的话。也许你可以澄清这一点。

票数 9
EN

Stack Overflow用户

发布于 2009-01-12 19:45:55

您需要将该模块标记为公共模块。

票数 55
EN

Stack Overflow用户

发布于 2009-01-13 07:12:53

.NET编译器可以采用任何类型的语言语法,并将其转换为.NET等效项。有时会有一对一的通信,其他时候则没有。

通过使用.NET Reflector,您可以看到编译器真正在做什么。

VB.NET中,该模块之所以存在,是因为继承自Visual BASIC,部分继承自Microsoft BASIC。

VB.NET编译器将接受以下内容

代码语言:javascript
运行
复制
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

并将其转换成这样(为简洁起见,省略了代码)

代码语言:javascript
运行
复制
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#中,等效项是

代码语言:javascript
运行
复制
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。

只要模块声明为公共模块,模块就会向引用原始程序集的其他程序集公开。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/436605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档