171 Stimmen

Klassen vs. Module in VB.NET

Ist es eine akzeptable Praxis, Module anstelle von Klassen mit Shared Member Functions in VB.NET zu verwenden?

Ich tendiere dazu, Module zu meiden, weil sie sich wie Überbleibsel von Visual Basic 6.0 anfühlen und nicht mehr so recht hineinzupassen scheinen. Andererseits scheint es keinen großen Unterschied zwischen der Verwendung eines Moduls und einer Klasse mit nur gemeinsam genutzten Mitgliedern zu geben. Ich brauche beides nicht so oft, aber manchmal gibt es Situationen, in denen sie eine einfache Lösung darstellen.

Ich bin neugierig zu erfahren, ob Sie eine Meinung oder Präferenz für die eine oder andere Seite haben.

11 Stimmen

Interessant an Modulen ist, dass die darin deklarierten Methoden und Funktionen standardmäßig die Schutzstufe des Moduls haben, was bedeutet, dass Sie versehentlich Methoden verfügbar machen könnten, wenn Sie vergessen, explizit die Option Private Bezeichner. In einer Klasse ist die Standard-Schutzstufe privat, was verwirrend sein kann, wenn man sich dessen nicht bewusst ist.

0 Stimmen

ICH BIN SO DANKBAR, DASS ICH DIES GEFUNDEN HABE! Ich habe mir das Hirn zermartert, um herauszufinden, wie Intellisense auf so viele andere Methoden und dergleichen zurückgreifen kann, ohne die Klassen explizit zu instanziieren, da ich mehrere Klassen entwickle, die ich devrait global sein, und mehr Erfahrung mit VBA haben Global Attribut, bin ich begeistert zu erfahren, dass Modules sind in der Tat genau das, wonach ich suche.

226voto

mmx Punkte 400975

Module s sind VB-Gegenstücke zu C# static Klassen. Wenn Ihre Klasse ausschließlich für Hilfsfunktionen und Erweiterungsmethoden konzipiert ist und Sie nicht erlauben wollen Vererbung y Instanziierung verwenden Sie eine Module .

Übrigens, die Verwendung von Module ist nicht wirklich subjektiv und es ist nicht veraltet . In der Tat müssen Sie eine Module wenn es angebracht ist. .NET Framework selbst tut dies viele Male ( System.Linq.Enumerable zum Beispiel). Um eine Erweiterungsmethode zu deklarieren, ist die Verwendung von Module s.

7 Stimmen

Richtig, obwohl ich einen privaten Konstruktor verwenden kann, um die Instanziierung und den NotInheritable-Modifikator zu verhindern. Das ist zwar etwas hässlicher als ein einfaches altes Modul, hat aber den gleichen Effekt. Danke für den Hinweis auf die Verwendung von Modulen im Framework; ich werde mir das mal ansehen.

8 Stimmen

Unter der Haube werden sie einfach zu Klassen mit dem Attribut [StandardModule] kompiliert. Außerdem zwingt die Verwendung von Modul Sie nicht nicht freigegebene Dinge dort zu haben, was eine gute Sache ist.

20 Stimmen

Module sind nicht dasselbe wie statische Klassen in C#. Methoden in einem Modul sind effektiv global, wenn sie in einem importierten Namespace liegen.

37voto

dr. evil Punkte 26388

Ich denke, es ist eine gute Idee, Module zu vermeiden, es sei denn, Sie stecken sie in separate Namespaces. Denn in Intellisense werden Methoden in Modulen von überall in diesem Namespace sichtbar sein.

Anstatt also ModuleName.MyMethod() Sie enden mit MyMethod() Popup-Fenster an beliebiger Stelle, und dies macht die Kapselung ungültig. (zumindest auf der Ebene der Programmierung).

Deshalb versuche ich immer, Klassen mit gemeinsam genutzten Methoden zu erstellen, das scheint viel besser zu sein.

7 Stimmen

Stimmt, ich arbeite gerade an einem alten Programm (wahrscheinlich eine Portierung von VB6 nach VB.NET 1) mit Klassen und Modulen. Es gibt Hunderte von globalen Variablen, Subs und Funktionen in etwa zehn verschiedenen Modulen, und es ist die Hölle, herauszufinden, was woher kommt und wie es geändert wurde.

0 Stimmen

Ok, das ist sehr alt, aber für meine Frage relevant. Ich bin pas ein VB-Typ, aber ich muss damit arbeiten. Ich versuche, eine große Klasse (>46.000 Zeilen) aufzuschlüsseln, weil IntelliSense/ReSharper einfach sterben. Ich habe gefunden, mit Modulen und nur herausreißen große Stücke von Funktionen in ihre eigenen Module scheint zu funktionieren, aber ich frage mich, wenn ich jedes Modul seinen eigenen Namespace als gut geben sollte. Wäre das notwendig? d.h. würde es beschleunigen IntelliSense nur mit den Modulen, oder würde Namespaces mehr helfen?

28voto

JaredPar Punkte 699699

Module sind keineswegs veraltet und werden in der VB-Sprache häufig verwendet. Es ist zum Beispiel die einzige Möglichkeit, eine Erweiterungsmethode in VB.Net zu implementieren.

Es gibt einen großen Unterschied zwischen Modulen und Klassen mit statischen Mitgliedern. Jede in einem Modul definierte Methode ist global zugänglich, solange das Modul im aktuellen Namespace verfügbar ist. Mit einem Modul können Sie also globale Methoden definieren. Dies ist etwas, was eine Klasse mit nur gemeinsamen Mitgliedern nicht tun kann.

Hier ist ein kurzes Beispiel, das ich häufig verwende, wenn ich VB-Code schreibe, der mit rohen COM-Schnittstellen zusammenarbeitet.

Module Interop
  Public Function Succeeded(ByVal hr as Integer) As Boolean
    ...
  End Function

  Public Function Failed(ByVal hr As Integer) As Boolean
    ...
  End Function
End Module

Class SomeClass
  Sub Foo()
    Dim hr = CallSomeHrMethod()
    if Succeeded(hr) then
      ..
    End If
  End Sub
End Class

4 Stimmen

Erweiterungsmethoden... ein weiteres schönes Feature, das ich immer benutzen will, aber nie wirklich dazu komme - nun, das gibt mir eine weitere gute Gelegenheit. Ich verstehe den Teil über den globalen Geltungsbereich, und global verfügbare Methoden können sicherlich praktisch sein, aber ich fühle mich ein wenig mulmig, wenn ich sie übermäßig verwende. Auf jeden Fall sagen mir alle bisherigen Antworten, dass ich Module nicht von vornherein ablehnen sollte; es gibt gute Gründe, sie unter den richtigen Umständen zu verwenden.

12voto

Chandra Malla Punkte 2329

Es ist zulässig, Folgendes zu verwenden Module . Module wird nicht als Ersatz verwendet für Class . Module dient seinem eigenen Zweck. Der Zweck von Module ist als Container zu verwenden für

  • Erweiterungsmethoden,
  • Variablen, die nicht spezifisch sind für eine Class , oder
  • Variablen, die sich nicht richtig in eine Class .

Module ist nicht wie ein Class da Sie nicht

  • erben von einer Module ,
  • einführen Interface mit einer Module ,
  • noch eine Instanz eines Module .

Alles, was innerhalb einer Module kann direkt innerhalb der Module ohne Bezugnahme auf die Module durch seinen Namen. Standardmäßig ist die Zugriffsstufe für eine Module es Friend .

11voto

Suji Punkte 1298

Klassen

  • Klassen können instanziiert werden als Objekte
  • Objektdaten sind für jedes instanziierte Objekt separat vorhanden.
  • Klassen können Schnittstellen implementieren .
  • Innerhalb einer Klasse definierte Mitglieder sind innerhalb einer bestimmten Instanz der Klasse skaliert und existieren nur für die Lebensdauer des Objekts .
  • Um auf Klassenmitglieder von außerhalb einer Klasse zuzugreifen, müssen Sie vollständig qualifizierte Namen im Format von Objekt.Mitglied .

Module

  • Module können nicht als Objekte instanziiert werden Da es nur eine Kopie der Daten eines Standardmoduls gibt, ist die Änderung einer öffentlichen Variablen in einem Standardmodul für das gesamte Programm sichtbar, wenn ein Teil Ihres Programms sie ändert.
  • Innerhalb eines Moduls deklarierte Mitglieder sind öffentlich zugänglich standardmäßig.
  • Jeder Code, der Zugriff auf das Modul hat, kann darauf zugreifen.
  • Das bedeutet, dass Variablen in einem Standardmodul effektiv globale Variablen sind, da sie von überall in Ihrem Projekt sichtbar sind und für die gesamte Dauer des Programms bestehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X