Ich habe eine Klasse, die Sie in einem Ordner übergeben und dann geht es ab und verarbeitet eine Menge Daten innerhalb des angegebenen Ordners.
Zum Beispiel:
%Vor%Nun, was es tut, geht es los und liest ein paar tausend Dateien und füllt die Klasse mit Daten.
Sollte ich diese Daten aus dem Konstruktor verschieben und als separate Methode verwenden, wie zum Beispiel:
%Vor%Vielleicht sollten Sie es auf diese Weise mit einer statischen Methode versuchen, die eine Instanz des Objekts zurückgibt.
%Vor%Dies hält den Initialisierungscode außerhalb Ihres Konstruktors und gibt Ihnen die "one line" -Deklaration, nach der Sie suchen.
Gehen Sie auf den Kommentar von unten aus dem Poster, indem Sie State eine Implementierung hinzufügen könnte wie folgt:
%Vor%Es kommt darauf an. Sie sollten den grundlegenden Zweck der Klasse bewerten. Welche Funktion führt es aus?
Was ich normalerweise bevorzuge ist, dass ein Klassenkonstruktor die Initialisierung durchführt, die für das Funktionieren der Klasse notwendig ist. Dann rufe ich Methoden für die Klasse auf, die sicher annehmen können, dass die notwendige Initialisierung durchgeführt wurde.
In der Regel sollte die Initialisierungsphase nicht zu intensiv sein. Ein alternativer Weg, um das oben genannte zu tun, könnte sein:
%Vor%Ist das alles, was Ihre Klasse tut? Wenn ja, würde ich sagen, dass es nicht wirklich wichtig ist. Aber es ist wahrscheinlich, dass deine Klasse mehr tut als das, was du gezeigt hast. Hat es zum Beispiel eine Fehlerbehandlung?
Der Zweck des Konstruktors besteht darin, ein Objekt zu konstruieren. Der Zweck einer Methode besteht darin, eine Aktion auszuführen. Also meine Stimme ist für dieses Formular:
%Vor%Ich stimme Ari und anderen zu - teile sie auf.
Ein Konstruktor sollte wirklich ein Minimum an Arbeit leisten (initialisieren Sie das Objekt einfach und lassen Sie es dabei). Mit einer separaten Methode, um die Arbeit zu erledigen:
Wenn dies die einzige Ressource ist, mit der die Klasse arbeitet, wäre es wahrscheinlich besser, den Pfad zum Konstruktor zu übergeben. Andernfalls wäre es ein Parameter für Ihre Klassenmitglieder.
Meine persönliche Vorliebe wäre, C # 3.0-Initialisierer zu verwenden.
%Vor%Dies hat einige Vorteile:
Ich werde die Leute hier "aufteilen". Wenn es hilft, versuchen Sie Folgendes:
Wenn Sie das hier anwenden, erhalten Sie Folgendes:
Das scheint mir logischer zu sein als "Der Konstruktor soll das Objekt erstellen und seine Daten aus dem Dateisystem laden.
Ich denke, Sie sollten sich zwischen den zwei oben genannten Ansätzen ("zuerst initialisieren, dann ausführen" vs. "leeres init, mit params ausführen") entscheiden, je nachdem, ob Sie dasselbe Objekt erneut verwenden möchten, um dieselbe Operation an einer anderen Eingabe auszuführen .
Wenn die Klasse nur verwendet wird, um die Aufgabe mit einem festen Parameter auszuführen, würde ich sie im Konstruktor initialisieren (so dass sie gerade gelesen wird) und dann die Aufgabe auf einer anderen Methode ausführen.
Wenn Sie die Aufgabe weiterhin für verschiedene Parameter ausführen möchten, würde ich sie in die Task-Methode selbst einfügen.
Wenn die Klasse diese Aufgabe ausführt, würde ich auch alles in eine statische Klasse / Methoden ändern - sie muss ihren internen Status nicht behalten.
Wie auch immer, ich würde niemals die Aufgabe selbst in den Konstruktor einfügen. Wie Cerebrus sagte, sollte die Initialisierung schnell sein.
Wenn der Hauptzweck Ihrer Klasse nicht die Ausführung von I / O ist, sollten Sie wahrscheinlich keine I / O-Operationen (möglicherweise eine IOException) im Konstruktor ausführen.
Ziehen Sie in Betracht, die Klasse in zwei Teile aufzuteilen:
%Vor%Auf diese Weise kann sich die Hauptklasse auf die Verwaltung ihres eigenen Zustands konzentrieren, während die Datenquelle den Anfangszustand aus dem Dateiinhalt erstellt.
Tags und Links c# constructor