я не могу сослаться к этому модулю, но если я поместил свой код в класс. Я могу сослаться к нему без любой проблемы. Кто-либо знает почему?
, поскольку Модули в VB не являются классами и не могут использоваться для инстанцирования объектов. Скорее они - что-то подобное пространствам имен с различием, что пространства имен не могут содержать функции непосредственно. Таким образом, причина модулей состоит в том, чтобы позволить группировать функции логически, которые не принадлежат классу.
Это имеет большой смысл, когда Вы полагаете, что не все логически принадлежит классу. Рассмотрите System.Math
. Нет абсолютно никакой причины сделать это классом кроме странного пуризма ООП.
Между прочим, Вы не можете сослаться на статические классы в C# также, по крайней мере, не, если я понимаю правильно, что Вы подразумеваете под “reference”. Возможно, можно разъяснить это.
Необходимо отметить модуль как Общедоступный Модуль.
. СЕТЕВЫЕ компиляторы могут взять любой тип синтаксиса языка и превратить его в эквивалентную.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.
Модули подвергнуты другим блокам, ссылающимся на исходный блок, пока модуль объявляется общественностью.
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
Возможно, методы/нижние индексы не общедоступны? У меня была та проблема однажды, и она предоставила бы локальный код доступа в Вашем классе, но не, если бы это было вне Вашего класса и отметило "Частный".
Я не понимаю то, что Вы спрашиваете.
VB.NET делает , имеют статические классы, точно так же, как в C#, потому что в VB.NET Module
static class
. Они являются одними и теми же. Что-либо, что можно сделать со статическим классом, который можно сделать с Модулем. Возможно, Вы не отметили свой Общедоступный/частный/защищенный доступ правильно?