Oznaczanie klasy statycznej w VB.NET


85

Jak właśnie stwierdzono w ostatnim pytaniu i odpowiedzi , nie można dziedziczyć z klasy statycznej. W jaki sposób można wymusić reguły, które są zgodne z klasami statycznymi wewnątrz VB.NET? Ponieważ framework jest kompatybilny między C # i VB, miałoby sens, że byłby sposób na oznaczenie klasy statycznej, ale wydaje się, że nie ma sposobu.

Odpowiedzi:


121

Moduł == klasa statyczna

Jeśli chcesz mieć klasę, której nie możesz dziedziczyć, użyj NotInheritableklasy; ale nie będzie statyczny / współdzielony. Możesz oznaczyć wszystkie metody, właściwości i składowe jako Shared, ale to nie jest dokładnie to samo, co klasa statyczna w C #, ponieważ nie jest wymuszana przez kompilator.

Jeśli naprawdę chcesz, aby VB.Net odpowiadał klasie statycznej C #, użyj pliku Module. Nie może być dziedziczona, a wszystkie składowe, właściwości i metody są statyczne / udostępnione.


2
Cofam swój poprzedni komentarz. Patrzyłem na moduł w reflektorze i IL pokazuje, że jest zapieczętowany.
— MagicKat

27
Czy jesteś VBerem? Moduł jest jak przestrzeń nazw. Wszystkie funkcje VB są importowane z modułów VB i są dostępne w ogólnym zakresie. Moim zdaniem statyczna klasa w vb nie jest modułem, ma inne zachowanie. jeśli chcesz zachować zachowanie „statycznej klasy” w vb, powinieneś mieć NotInheritable i zadeklarować wszystkie jego elementy członkowskie jako „Shared”, tak jak musiałbyś to zrobić w statycznej klasie C #, będą zachowywać się TAKIE SAME. Moduł NIE.
— Shimmy Weitzhandler

2
@Shimmy Nie wiem, jak przegapiłem ten komentarz wcześniej, ale się mylisz. Spójrz na wygenerowany IL, a moduły są traktowane dokładnie tak samo, jak klasa statyczna. VB po prostu wykonuje dodatkową pracę dla starych funkcji standardowych, aby pojawiały się w zasięgu globalnym.
— Joel Coehoorn

2
@JoelCoehoorn Module ≈≈ statyczna klasa, ponieważ moduł musi być zadeklarowany bezpośrednio w przestrzeni nazw. Oznacza to, że nie można zadeklarować modułu w module lub klasie.
— LosManos

20
@JoelCoehoorn Fakt, że moduły i klasy statyczne kończą się tym samym IL jest dobrze wiedzieć, ale VB dodatkowo promuje składowe modułu do zawierającej je przestrzeni nazw. Promocja aspektem jest to, gdzie moduły i ćwiczenia statyczne różnią się w praktyce i IMHO to jest ogromna różnica. Zdecydowanie wolę NotInheritable - pusty prywatny konstruktor - rozwiązanie współdzielone przez wszystkich członków , ponieważ do członków można dotrzeć tylko za pośrednictwem klasy, co jest znacznie bardziej poprawnym zachowaniem, jeśli próbujesz uzyskać równoważność klas statycznych. IL może być inny, ale to naprawdę akademickie.
— misha256

51

Prawie na miejscu. Musisz też zapobiegać tworzeniu instancji.

NotInheritable Class MyStaticClass

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

    End Sub

    Public Shared Function MyMethod() As String

    End Function

End Class
  • Shared jest podobny do metody klasy statycznej.
  • NotInheritable jest jak zapieczętowane.
  • Private New jest jak klasa statyczna nie może zostać utworzona.

Zobacz:
MSDN - klasy statyczne i składowe klas statycznych


2
dlaczego nie jest to akceptowana odpowiedź? Dzięki za wycinek kodu
— ArcherBird

6

Jeśli chcesz tylko utworzyć klasę, której nie możesz dziedziczyć, w C # możesz użyć Sealed, aw VB.Net użyć NotInheritable.

Współdzielony jest odpowiednik static w VB.Net.


oznaczysz jego zmienne i funkcjonalności jako udostępnione, tak jak w przypadku klasy statycznej C #. Oznaczenie jako NotInheritable sprawia, że ​​jest on zapieczętowany.
— Shimmy Weitzhandler

5

Możesz stworzyć statyczną klasę w vb.net. Rozwiązaniem jest

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

Zmienna AGE jest publiczną statyczną, możesz jej użyć w innym kodzie tak po prostu

 Dim myage As Integer = DB.AGE

Friend = public, NotInheritable = static


3
Przyjaciel! = Publiczny, przyjaciel = wewnętrzny
— Altair

1
NotInheritable! = Static, NotInheritable == seal
— Magnus

myage! = 20 (więcej, niestety)
— Ponury

2

Z punktu widzenia środowiska CLR klasa statyczna C # jest po prostu klasą „zapieczętowaną” i „abstrakcyjną”. Nie możesz utworzyć instancji, ponieważ jest abstrakcyjna i nie możesz po niej dziedziczyć, ponieważ jest zapieczętowana. Reszta to tylko trochę magii kompilatora.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.