Маркировка класса статическим в VB.NET

85

Как только что было сказано в недавнем вопросе и ответе , вы не можете наследовать от статического класса. Как обеспечить соблюдение правил, которые соответствуют статическим классам внутри VB.NET? Поскольку фреймворк совместим между C # и VB, было бы разумно, чтобы был способ пометить класс как статический, но, похоже, способа нет.

MagicKat
источник

Ответы:

121

Модуль == статический класс

Если вам просто нужен класс, который вы не можете наследовать, используйте NotInheritableкласс; но он не будет статическим / общим. Вы можете пометить все методы, свойства и члены как Shared, но это не совсем то же самое, что статический класс в C #, поскольку компилятор не применяет его.

Если вам действительно нужен эквивалент VB.Net статическому классу C #, используйте Module. Его нельзя унаследовать, и все члены, свойства и методы являются статическими / общими.

Джоэл Кохорн
источник
2
Я отказываюсь от своего предыдущего комментария. Я смотрел на модуль в отражателе, и IL показывает, что он запечатан.
MagicKat
27
Вы VBer? Модуль похож на пространство имен. Все функции VB импортируются из модулей VB и доступны в общем объеме. На мой взгляд, статический класс в vb не является модулем, у него другое поведение. если вам нужно поведение «статического класса» в vb, у вас должен быть NotInheritable и объявить все его члены «Shared», точно так же, как вы должны были бы сделать в статическом классе C #, они будут вести себя ТАК ЖЕ. Модуль НЕ.
Шимми Вайцхандлер
2
@Shimmy Не знаю, как я раньше пропустил этот комментарий, но вы ошибаетесь. Посмотрите на сгенерированный IL, и модули обрабатываются точно так же, как статический класс. VB просто выполняет дополнительную работу для старых стандартных функций, чтобы они отображались в глобальной области видимости.
Joel Coehoorn
2
@JoelCoehoorn Module ≈≈ статический класс, поскольку модуль должен быть объявлен непосредственно в пространстве имен. Это означает, что нельзя объявить модуль в модуле или классе.
LosManos
20
@JoelCoehoorn Тот факт, что модули и статические классы в конечном итоге имеют один и тот же IL, хорошо знать, но VB дополнительно продвигает члены модуля в содержащее пространство имен. Продвижение аспект , где модули и статические классы различаются в практическом использовании и ИМХО это массивная разница. Я предпочитаю NotInheritable - пустой частный конструктор - общее решение для всех членов, потому что члены могут быть доступны только через класс, что является гораздо более правильным поведением, если вы пытаетесь получить эквивалентность статического класса. IL может быть другим, но на самом деле это академично.
misha256
51

Почти готово. Вы также должны предотвратить создание экземпляров.

NotInheritable Class MyStaticClass

    ''' <summary>
    ''' Prevent instantiation.
    ''' </summary>
    Private Sub New()

    End Sub

    Public Shared Function MyMethod() As String

    End Function

End Class
  • Shared похож на метод статического класса.
  • NotInheritable подобен запечатанному.
  • Private New похож на статический класс, который не может быть создан.

См .:
MSDN - Статические классы и члены статических классов.

Гэри Ньюсом
источник
2
почему это не принятый ответ? Спасибо за фрагмент кода
ArcherBird
6

Если вы просто хотите создать класс, который не можете наследовать, в C # вы можете использовать Sealed, а в VB.Net - NotInheritable.

Общий эквивалент VB.Net static.

Чарльз Грэм
источник
вы помечаете его переменные и функциональные возможности как общие, как и в статическом классе C #. Маркировка как NotInheritable делает его запечатанным.
Шимми Вайцхандлер,
5

Вы можете создать статический класс в vb.net. Решение

Friend NotInheritable Class DB
    Public Shared AGE As Integer = 20
End Class

Переменная AGE является общедоступной статической, вы можете использовать ее в другом коде, как это

 Dim myage As Integer = DB.AGE

Друг = общедоступный, NotInheritable = статический

Наставник
источник
3
Friend! = Public, Friend = internal
Altair
1
NotInheritable! = Static, NotInheritable == sealed
Магнус
myage! = 20 (больше, к сожалению)
Grim
2

С точки зрения CLR статический класс C # - это просто «запечатанный» и «абстрактный» класс. Вы не можете создать экземпляр, потому что он абстрактный, и вы не можете наследовать от него, поскольку он запечатан. Остальное - просто волшебство компилятора.

Илья Рыженков
источник