VB.NET: Как сослаться на модуль VB.NET?

17
задан Peter Mortensen 15 January 2010 в 23:41
поделиться

6 ответов

я не могу сослаться к этому модулю, но если я поместил свой код в класс. Я могу сослаться к нему без любой проблемы. Кто-либо знает почему?

, поскольку Модули в VB не являются классами и не могут использоваться для инстанцирования объектов. Скорее они - что-то подобное пространствам имен с различием, что пространства имен не могут содержать функции непосредственно. Таким образом, причина модулей состоит в том, чтобы позволить группировать функции логически, которые не принадлежат классу.

Это имеет большой смысл, когда Вы полагаете, что не все логически принадлежит классу. Рассмотрите System.Math. Нет абсолютно никакой причины сделать это классом кроме странного пуризма ООП.

Между прочим, Вы не можете сослаться на статические классы в C# также, по крайней мере, не, если я понимаю правильно, что Вы подразумеваете под “reference”. Возможно, можно разъяснить это.

9
ответ дан 30 November 2019 в 10:11
поделиться

Необходимо отметить модуль как Общедоступный Модуль.

50
ответ дан 30 November 2019 в 10:11
поделиться

. СЕТЕВЫЕ компиляторы могут взять любой тип синтаксиса языка и превратить его в эквивалентную.NET. Иногда существует один к одному корреспонденция другие времена, там не.

При помощи Отражатель.NET Вы видите то, что действительно делает компилятор.

В 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 в языке. Например, Целое число ключевого слова испускание Int32 вместо Int16.

Модули подвергнуты другим блокам, ссылающимся на исходный блок, пока модуль объявляется общественностью.

7
ответ дан 30 November 2019 в 10:11
поделиться
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
0
ответ дан 30 November 2019 в 10:11
поделиться

Возможно, методы/нижние индексы не общедоступны? У меня была та проблема однажды, и она предоставила бы локальный код доступа в Вашем классе, но не, если бы это было вне Вашего класса и отметило "Частный".

1
ответ дан 30 November 2019 в 10:11
поделиться

Я не понимаю то, что Вы спрашиваете.

VB.NET делает , имеют статические классы, точно так же, как в C#, потому что в VB.NET Module static class. Они являются одними и теми же. Что-либо, что можно сделать со статическим классом, который можно сделать с Модулем. Возможно, Вы не отметили свой Общедоступный/частный/защищенный доступ правильно?

-1
ответ дан 30 November 2019 в 10:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: