Позначення статики класу у VB.NET


85

Як було сказано в нещодавньому питанні та відповіді , ви не можете успадкувати від статичного класу. Як застосовувати правила, що поєднуються зі статичними класами всередині VB.NET? Оскільки фреймворк сумісний між C # і VB, було б логічно, що існував би спосіб позначення класу статичним, але, схоже, цього не існує.

Відповіді:


121

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

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

Якщо ви дійсно хочете, щоб VB.Net еквівалентний статичному класу C #, використовуйте Module. Його неможливо успадкувати, і всі члени, властивості та методи є статичними / спільними.


2
Я відкликаю свій попередній коментар. Я дивився на модуль у рефлекторі, і ІЛ показує його як герметичний.
MagicKat

27
Ви VBer? Модуль схожий на простір імен. Всі функції VB імпортовані з модулів VB, і вони доступні в загальному обсязі. На мій погляд, статичний клас у vb не є модулем, він має іншу поведінку. якщо ви хочете поведінку 'статичного класу' у vb, ви повинні мати NotInheritable і оголосити всіх його учасників 'Спільними', як і те, що вам потрібно було б зробити у статичному класі C #, вони будуть поводитись ТЕЖЕ. Модуль НЕ.
Shimmy Weitzhandler

2
@Shimmy Я не знаю, як я пропустив цей коментар раніше, але ти помиляєшся. Подивіться на генерований ІЛ, і модулі отримують точно таку ж обробку, як і статичний клас. VB просто робить додаткову роботу для старих стандартних функцій, щоб вони відображались у глобальному масштабі.
Joel Coehoorn

2
@JoelCoehoorn Module ≈≈ статичний клас, оскільки модуль повинен бути оголошений безпосередньо у просторі імен. Це означає, що не можна оголошувати модуль в модулі або класі.
LosManos

20
@JoelCoehoorn Той факт, що модулі та статичні класи отримують однаковий IL, корисно знати, але VB додатково просуває членів модуля до вміщуваного простору імен. Просування аспект , де модулі і статичні класи розрізняються в практичному використанні і на мою думку це масивна різниця. Я набагато віддаю перевагу NotInheritable - порожній приватний конструктор - спільне рішення для всіх членів, оскільки членів можна отримати лише через клас, що є набагато правильнішою поведінкою, якщо ви намагаєтесь отримати еквівалентність статичного класу. Іл може бути іншим, але це насправді академічно.
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 статики.


Ви позначаєте, що це змінні та функціональні можливості, як спільні, як це потрібно було б робити в статичному класі C #. Позначення як NotInheritable робить його герметичним.
Shimmy Weitzhandler

5

Ви можете створити статичний клас у vb.net. Рішення є

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

Змінна AGE є загальнодоступною статикою, ви можете використовувати її в іншому коді просто так

 Dim myage As Integer = DB.AGE

Друг = public, NotInheritable = static


3
Друг! = ​​Публічний, Друг = внутрішній
Altair

1
NotInheritable! = Static, NotInheritable == sealed
Magnus

! ТуАд = 20 (більше, до жаль)
Grim

2

З точки зору CLR, статичний клас C # - це просто "герметичний" та "абстрактний" клас. Ви не можете створити екземпляр, оскільки він абстрактний, і ви не можете успадкувати його, оскільки він запечатаний. Решта - це лише якась магія компілятора.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.