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.