C # Konstruktorparameter an Instanzvariablen binden

8

Sehr häufiges Szenario: Ich habe eine Klasse mit mehreren Instanzvariablen und einen Konstruktor, der mehrere Parameter akzeptiert. Kann ich den einen irgendwie miteinander verbinden? Das Zuweisen aller Parameter zu den Instanzvariablen ist sehr ausführlich und ist eine der Situationen, die durch das Konvention-über-Konfiguration-Prinzip abgedeckt werden könnten (und sollten). Mein Beispielcode sieht so aus:

%Vor%

Gibt es einen einfachen Weg, um dies loszuwerden und C # automatisch zu zaubern?

    
Jan 28.08.2012, 12:27
quelle

3 Antworten

2

Obwohl es viele Plugins gibt, die solche Dinge tun können - es ist erwähnenswert, dass wenn Sie VS2010 + native Fähigkeit, Konstruktoren von einem Modellaufruf zu generieren, wenn ein passender Konstruktor nicht existiert, können Sie eine einfache Tastenkombination verwenden arbeite für dich.

i.e. wenn ich eine Stub-Klasse:

%Vor%

Und dann schreibe ich irgendwo in einer Methode so etwas:

%Vor%

Wenn ein solcher Konstruktor nicht existiert, erscheint eine kleine Hilfsschaltfläche. Wenn Sie darauf klicken oder ALT+SHIFT+F10 (standardmäßig) drücken, erhalten Sie ein Menü, in dem Sie einen Stub-Konstruktor erstellen können, der dann den MyClass -Code wie folgt ändert:

%Vor%     
Andras Zoltan 28.08.2012, 12:45
quelle
5

In der C # -Sprache gibt es nichts, was das betrifft, nein. Während Tools Code für Sie generieren können, müssen sie nicht immer auf dem neuesten Stand sein und Sie werden immer noch mit dem Code vorhanden und sichtbar sein. Sie könnten möglicherweise dies in einigen Szenarien mithilfe von Reflektion tun, z. B .:

%Vor%

... wo Sie die Werte in der gleichen Reihenfolge wie die Parameter angeben müssen, und behalten Sie die Namen wie die Felder usw. Sie können auch Probleme finden, wenn die Felder readonly .

Persönlich würde ich es einfach suck - benutze Tools, um den Code zu generieren, wenn du willst, aber ansonsten lebe einfach damit.

Beachten Sie, dass Sie beim Festlegen der Felder möglicherweise eine Validierung durchführen möchten, insbesondere in Bezug auf Nichtigkeit. So kann Ihr Konstruktor-Körper tatsächlich wie folgt enden:

%Vor%

(Für eine geeignete Preconditions -Klasse natürlich. Ich habe die Idee von Guava im Java-Code, wie ich sie im täglichen Coding verwende, unentbehrlich geklaut. Dies ist der Ansatz, den wir in Noda Time auch.)

    
Jon Skeet 28.08.2012 12:35
quelle
4

"... könnte (und sollte) vom Prinzip der Konvention über die Konfiguration erfasst werden ..."

"Konvention über Konfiguration" gilt normalerweise für eine API oder ein Framework wie MVC oder Entity Framework, nicht für die Sprache selbst. Eine API ist typischerweise eine fokussierte, wiederverwendbare und vor allem Vereinfachung Abstraktion der Funktionalität. In dieser Situation können Diktierkonventionen dazu beitragen, die Struktur zu verbessern, ohne die Funktionalität zu beeinträchtigen.

Dies gilt jedoch nicht für die Programmiersprache. Die Sprache ist breit und niedrig und komplex im Vergleich. Es sollte seinen Benutzer so wenig wie möglich einschränken, ohne den Wert der Sprache zu verwässern. Die Annahme einer solchen "Konvention" wäre sehr präskriptiv. Darüber hinaus wäre es für den Compiler gefährlich, davon auszugehen, dass ein Parameter mit einem gegebenen Namen immer einem privaten Feld mit ähnlichem Namen zugewiesen werden muss.

Zum einen ist Ihre Konvention nicht die einzige, die am häufigsten verwendet wird. Zum Beispiel schlägt ein gängiger Codierungsstil private Unterstriche ( _param1 ) vor, die Ihre Konvention vermissen würde. Der Konstruktor verfügt möglicherweise über eine weitere Logik, die über diese Zuweisungen hinausgeht. In diesem Fall ist Ihre Konvention zu einfach: Soll der "convention-driven" -Code vor oder nach einer anderen Konstruktorlogik ausgeführt werden?

Am wichtigsten ist, wie sollte eine solche Konvention außer Kraft gesetzt werden? Wenn Sie im Konstruktor param1 auf andere Weise konsumieren würden, führen Sie die Konvention trotzdem aus? Was, wenn ich im Konstruktor this.param1 einen anderen Wert zuweise? Sollte Ihre Konvention vor oder nach dem Code stattfinden, den der Benutzer hinzugefügt hat?

Auch diese kurzen Fragen - für die viele Menschen sehr unterschiedliche und gleichermaßen gültige Antworten haben werden - sind genug, um darauf hinzuweisen, dass eine solche Konvention nicht so offensichtlich oder einfach zu definieren ist, wie es scheint.

    
Dan Puzey 28.08.2012 12:39
quelle

Tags und Links