Фактически нет такой вещи как Shared
класс в VB.NET. (Shared
- это ключевое слово VB.NET для того, что мы знаем и любим как static
в C#). Только переменные (поля), события, функции/подтипы, свойства и операторы могут быть отмечены Shared
. (Локальные переменные, которые сохраняют свои значения во всех вызовах, не отмечены Shared
, а скорее Static
. CLR не поддерживает их, а также не C#, но компилятор VB.NET испускает дополнительный код, необходимый для его работы.)
есть два пути, чтобы осуществить тот же результат, как статический класс в VB.NET:
Создать Module
. Практически это то же самое, что и статический класс. Действительно, с точки зрения ИЛ они идентичны. Тем не менее, модули обрабатываются несколько иначе на языке VB.NET. Концепция модулей была унаследована от устаревших VB на основе COM (на самом деле они намного старше этого, вернувшись к ранним версиям BASIC)
Если вы знакомы с C++ или подобными языками, модуль сродни пространство имен, за исключением того, что все функции, определенные в модуле, продвигаются во внешнюю область (охватывающее пространство имен) через Microsoft.VisualBasic.CompilerServices.StandardModule
attribute. Модуль никогда нельзя рассматривать как класс, поэтому любые объявления или ссылки на модуль являются незаконными. Тем не менее, вы можете (и, как правило, предпочитаете) вызывать функцию, определенную в модуле, с использованием полностью квалифицированной ссылки (, например, MyModule.MyFunction(...)
).
Создать NotInheritable
класс (VB.NET эквивалент C# s abstract
ключевое слово), дать ему пустой Private
конструктор, и отметьте все его методы, как Shared
. Обратите внимание, что сам класс не является общим/статическим - только отдельные функции, составляющие этот класс. Поэтому компилятор не применяет правило, что экземпляр этого класса нельзя объявить, поскольку с точки зрения компилятора класс не отличается от любого другого класса.
Поскольку .NET BCL была написана на C#, она использует вариант 2. Всех классов, которые были отмечены static
просто NotInheritable
классов в VB.NET с функциями Shared
членов и частными застройщиками. Например, декларация System.IO.File
выглядит следующим образом VB.NET:
Public NotInheritable Class File
Inherits System.Object
' Contains Shared methods, e.g.:
Public Shared Sub Copy(sourceFileName As String, destFileName As String)
' implementation
End Sub
' private constructor to prevent instantiation
Private Sub New()
End Sub
End Class
Обратите внимание, что поскольку только конкретизации запрещается (с помощью решений конструктор приватным), компилятор по-прежнему позволяет объявлять пустые переменные, которые тип класса. Разумеется, им никогда не может быть присвоено значение, поэтому они всегда будут равны Nothing
.(TypeOf(test) Is Nothing
вернет True
, в этом случае, как и test Is Nothing
, и TypeName(test)
вернет Nothing
).
@CodyGray: No - VB должно быть предупреждением об объявлении переменной статического типа, которая, как представляется, не имеет никакой цели (это ошибка компиляции в C#). –
Извините. Мне потребовалось некоторое время, чтобы понять, что 'System.IO.File' является статическим классом, поэтому наличие переменной этого типа не имеет смысла. – sstan
К нисходящим - я думаю, что вы поспешны и не очень читаете вопрос. –