Czy dopuszczalną praktyką jest używanie modułów zamiast klas ze współdzielonymi funkcjami składowymi w VB.NET?
Staram się unikać modułów, ponieważ wydaje się, że pozostały resztki z Visual Basic 6.0 i tak naprawdę nie pasują już do nich. Z drugiej strony wydaje się, że nie ma dużej różnicy między używaniem modułu a klasą z tylko współdzielonymi członkami. Nie jest tak często, że naprawdę potrzebuję ich, ale czasami zdarzają się sytuacje, w których stanowią one proste rozwiązanie.
Jestem ciekawy, czy masz jakieś zdanie lub preferencje w taki czy inny sposób.
Private
kwalifikator. W klasie domyślnym poziomem ochrony jest prywatny, co może być mylące, jeśli nie jesteś tego świadomy.Odpowiedzi:
Module
s są odpowiednikami VBstatic
klas C # . Gdy Twoja klasa jest zaprojektowana wyłącznie dla funkcji pomocniczych i metod rozszerzających i nie chcesz zezwalać na dziedziczenie i tworzenie instancji , używasz rozszerzeniaModule
.Nawiasem mówiąc, używanie
Module
nie jest tak naprawdę subiektywne i nie jest przestarzałe . Rzeczywiście, musisz użyć,Module
kiedy jest to właściwe. Sama .NET Framework robi to wiele razy (System.Linq.Enumerable
na przykład). Aby zadeklarować metodę rozszerzenia, wymagane jest użycieModule
s.źródło
Myślę, że dobrym pomysłem jest unikanie modułów, chyba że umieścisz je w oddzielnych przestrzeniach nazw. Ponieważ w Intellisense metody w modułach będą widoczne z każdego miejsca w tej przestrzeni nazw.
Więc zamiast tego kończysz
ModuleName.MyMethod()
zMyMethod()
wyskakującymi okienkami w dowolnym miejscu i ten rodzaj unieważnia hermetyzację. (przynajmniej na poziomie programowania).Dlatego zawsze staram się tworzyć klasę metodami współdzielonymi, wydaje się o wiele lepsza.
źródło
Moduły nie są w żadnym wypadku przestarzałe i są intensywnie używane w języku VB. Jest to na przykład jedyny sposób na zaimplementowanie metody rozszerzającej w VB.Net.
Istnieje jedna ogromna różnica między modułami a klasami ze statycznymi składnikami. Każda metoda zdefiniowana w module jest dostępna globalnie, o ile moduł jest dostępny w bieżącej przestrzeni nazw. W efekcie moduł umożliwia definiowanie metod globalnych. To jest coś, czego nie może zrobić klasa, w której są tylko współdzieleni członkowie.
Oto krótki przykład, którego często używam podczas pisania kodu VB, który współdziała z surowymi interfejsami COM.
źródło
Dopuszczalne jest użycie
Module
.Module
nie jest używany jako zamiennikClass
.Module
służy swojemu celowi. CelemModule
jest użycie jako pojemnikaClass
, lubClass
.Module
nie jest jak a,Class
ponieważ nie możeszModule
,Interface
zModule
,Module
.Do wszystkiego wewnątrz a
Module
można uzyskać bezpośredni dostęp w ramachModule
zespołu bez odwoływania się doModule
jego nazwy. Domyślnie poziom dostępu dla aModule
toFriend
.źródło
Zajęcia
Moduły
źródło
Kiedy jedna z moich klas VB.NET ma wszystkich współdzielonych członków, konwertuję ją na Module z pasującą (lub w inny sposób odpowiednią) przestrzenią nazw lub sprawiam, że klasa nie jest dziedziczona ani konstruowana:
źródło
Imports <whatever>
jeśli masz jakiekolwiek importu,Namespace MyCoolModule
,Public Module MyCoolModule
, <członkowie bezShared
>,End Module
,End Namespace
.Moduły nadają się do przechowywania wyliczeń i niektórych zmiennych globalnych, stałych i funkcji wspólnych. to bardzo dobra rzecz i często z niej korzystam. Zadeklarowane zmienne są widoczne w całym projekcie.
źródło
Jeśli tworzysz metody rozszerzające, musisz użyć modułu (zamiast klasy). W VB.NET nie znam innej opcji.
Będąc odpornym na moduły, spędziłem bezwartościowe kilka godzin próbując wymyślić, jak dodać jakiś standardowy kod, aby rozwiązać osadzone zespoły w jednym, tylko po to, aby dowiedzieć się, że
Sub New()
(Moduł) iShared Sub New()
(Klasa) są równoważne. (I nawet nie wiedzą, że nie było wywoływalnymSub New()
w module!)Więc po prostu rzucił
EmbeddedAssembly.Load
iAddHandler AppDomain.CurrentDomain.AssemblyResolve
linie tam i Bob stał wuj.Dodatek : nie sprawdziłem jeszcze tego w 100%, ale mam podejrzenie, które
Sub New()
działa w innej kolejności w module niż w klasie, po prostu przechodząc przez fakt, że musiałem przenieść niektóre deklaracje do metod wewnętrznych z zewnątrz, aby tego uniknąć błędy.źródło