Позначення статики класу у 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.