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

时间:2009-01-12 19:13:35

标签: vb.net

我有一个Utility模块,因为VB.NET没有像C#这样的静态类,而Module是VB.NET中的静态类。我使用模块的原因是因为我使用的是Extension方法,它只能在Module中使用。

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

编辑:模块位于类库调用Utility中。

6 个答案:

答案 0 :(得分:44)

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

答案 1 :(得分:9)

  

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

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

当你认为并非逻辑上属于一个类时,这很有意义。考虑System.Math。除了一种奇怪的OOP纯粹主义之外,绝对没有理由把它作为一个类。

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

答案 2 :(得分:6)

.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 BASIC 6程序员对MS语言的变化非常恼火的主要原因。例如,关键字Integer发出Int32而不是Int16。

只要模块被声明为公共模块,模块就会暴露给引用原始程序集的其他程序集。

答案 3 :(得分:1)

也许方法/子不公开?我曾经遇到过这个问题,并且它允许访问您班级中的本地代码,但如果它不在您的班级之内并标记为“私有”,则不会。

答案 4 :(得分:0)

Imports System.Web
Imports System.Web.UI

Module ResponseHelper

    <System.Runtime.CompilerServices.Extension()> _
    Public Sub Redirect(ByVal response As Net.HttpWebResponse, _
                        ByVal url As String, ByVal target As String, _
                        ByVal windowFeatures As String)

        If String.IsNullOrEmpty(target) Or _
           target.Equals("_self", StringComparison.OrdinalIgnoreCase) And _
           String.IsNullOrEmpty(windowFeatures) Then
            response.Redirect(url, target, windowFeatures)
        Else
            Dim page As Page = CType(HttpContext.Current.Handler, Page)
            If page Is Nothing Then
                Throw New InvalidOperationException("Cannot redirect to new window outside Page context.")
            End If
            url = page.ResolveClientUrl(url)
            Dim script As String
            If String.IsNullOrEmpty(windowFeatures) Then
                script = "window.open(""{0}"", ""{1}"", ""{2}"";"
            Else
                script = "window.open(""{0}"", ""{1}"");"
            End If
            script = String.Format(script, url, target, windowFeatures)
            ScriptManager.RegisterStartupScript(page, GetType(Page), "Redirect", script, True)

        End If
    End Sub

End Module

答案 5 :(得分:-1)

我不明白你在问什么。

VB.NET 确实有静态类,就像在C#中一样,因为在VB.NET中Module IS a static class。他们是一样的。您可以使用模块执行静态类的任何操作。也许您没有正确标记您的公共/私人/受保护的访问权限?