Wird es als akzeptabel angesehen, in VB.NET Module anstelle von Klassen mit gemeinsam genutzten Elementfunktionen zu verwenden?
Ich neige dazu, Module zu meiden, weil sie das Gefühl haben, Reste von Visual Basic 6.0 zu haben und nicht mehr wirklich zu passen. Andererseits scheint es keinen großen Unterschied zwischen der Verwendung eines Moduls und einer Klasse mit nur gemeinsam genutzten Mitgliedern zu geben. Es ist nicht so oft, dass ich wirklich viel Bedarf habe, aber manchmal gibt es Situationen, in denen sie eine einfache Lösung darstellen.
Ich bin gespannt, ob Sie auf die eine oder andere Weise eine Meinung oder Vorlieben haben.
Private
Qualifikationsmerkmal explizit hinzuzufügen . In einer Klasse ist die Standardschutzstufe privat. Dies kann verwirrendes Verhalten sein, sofern Sie sich dessen nicht bewusst sind.Antworten:
Module
s sind VB-Gegenstücke zu C #static
-Klassen. Wenn Ihre Klasse ausschließlich für Hilfsfunktionen und Erweiterungsmethoden konzipiert ist und Sie keine Vererbung und Instanziierung zulassen möchten , verwenden Sie aModule
.Übrigens ist die Verwendung
Module
nicht wirklich subjektiv und nicht veraltet . In der Tat müssen Sie ein verwenden,Module
wenn es angemessen ist. .NET Framework selbst macht das viele Male (System.Linq.Enumerable
zum Beispiel). Um eine Erweiterungsmethode zu deklarieren, mussModule
s verwendet werden.quelle
Ich denke, es ist eine gute Idee, Module weiterhin zu vermeiden, es sei denn, Sie stecken sie in separate Namespaces. Denn in Intellisense sind Methoden in Modulen von überall in diesem Namespace sichtbar.
Anstatt dass
ModuleName.MyMethod()
SieMyMethod()
irgendwo Popups haben, macht diese Art der Kapselung ungültig. (zumindest in der Programmierebene).Deshalb versuche ich immer, eine Klasse mit gemeinsamen Methoden zu erstellen, scheint so viel besser zu sein.
quelle
Module sind keineswegs veraltet und werden in der VB-Sprache häufig verwendet. Dies ist beispielsweise die einzige Möglichkeit, eine Erweiterungsmethode in VB.Net zu implementieren.
Es gibt einen großen Unterschied zwischen Modulen und Klassen mit statischen Elementen. Auf jede in einem Modul definierte Methode kann global zugegriffen werden, solange das Modul im aktuellen Namespace verfügbar ist. In einem Modul können Sie tatsächlich globale Methoden definieren. Dies kann eine Klasse mit nur gemeinsam genutzten Mitgliedern nicht.
Hier ist ein kurzes Beispiel, das ich häufig beim Schreiben von VB-Code verwende, der mit unformatierten COM-Schnittstellen zusammenarbeitet.
quelle
Es ist akzeptabel zu verwenden
Module
.Module
wird nicht als Ersatz für verwendetClass
.Module
dient seinem eigenen Zweck. Der Zweck vonModule
ist als Behälter für zu verwendenClass
, oderClass
.Module
ist nicht wie einClass
da kannst du nichtModule
,Interface
mit aModule
,Module
.Auf alles in einem
Module
kann direkt innerhalb derModule
Baugruppe zugegriffen werden, ohne auf denModule
Namen zu verweisen . Standardmäßig wird die Zugriffsebene für einenModule
istFriend
.quelle
Klassen
Module
quelle
Wenn eine meiner VB.NET-Klassen alle gemeinsam genutzten Mitglieder hat, konvertiere ich sie entweder in ein Modul mit einem passenden (oder anderweitig geeigneten) Namespace oder mache die Klasse nicht vererbbar und nicht konstruierbar:
quelle
Imports <whatever>
Wenn Sie irgendwelche ImporteNamespace MyCoolModule
,Public Module MyCoolModule
<Mitglieder ohneShared
>,End Module
,End Namespace
.Module eignen sich gut zum Speichern von Aufzählungen und einigen globalen Variablen, Konstanten und gemeinsam genutzten Funktionen. Es ist sehr gut und ich benutze es oft. Deklarierte Variablen sind im gesamten Projekt sichtbar.
quelle
Sie müssen ein Modul (anstelle einer Klasse) verwenden, wenn Sie Erweiterungsmethoden erstellen. In VB.NET ist mir keine andere Option bekannt.
Da ich selbst gegen Module resistent bin, habe ich nur ein paar Stunden lang wertlos versucht, herauszufinden, wie man Boilerplate-Code hinzufügt, um eingebettete Assemblys in einer aufzulösen, nur um herauszufinden, dass
Sub New()
(Module) undShared Sub New()
(Class) gleichwertig sind. (Ich wusste nicht einmal, dass es das gab eine aufrufbareSub New()
in einem Modul!)Also warf ich einfach die
EmbeddedAssembly.Load
undAddHandler AppDomain.CurrentDomain.AssemblyResolve
Zeilen hinein und Bob wurde mein Onkel.Nachtrag : Ich habe es noch nicht zu 100% ausgecheckt, aber ich habe eine Ahnung,
Sub New()
die in einem Modul in einer anderen Reihenfolge als in einer Klasse ausgeführt wird, nur weil ich einige Deklarationen von außen auf interne Methoden verschieben musste, um dies zu vermeiden Fehler.quelle