Frage

Mit dem neuen Ansatz, die get mit / set im Attribut der Klasse wie folgt aus:

public string FirstName {
        get; set;
    }

Warum einfach einfach nicht das Attribut setzt First Öffentlichkeit ohne Accessor?

War es hilfreich?

Lösung

Zwei der großen Probleme mit dem direkten Zugriff auf Variable in Klasse (Feld / Attribut) sind:

1) Sie können nicht einfach databind gegen Felder aus.

2) Wenn Sie öffentliche Felder aus Ihren Klassen aussetzen können Sie später nicht mehr sie (zum Beispiel Eigenschaften ändern: Validierungslogik auf die Setter)

hinzufügen

Andere Tipps

Da in der Zukunft, wenn Sie die Implementierung ändern, Code der aktuelle Schnittstelle wird nicht brechen.

Zum Beispiel können Sie eine einfache Klasse mit einem öffentlichen Bereich implementieren und starten Sie Ihre Klasse in einigen externen Modulen. Ein Monat später entdecken Sie Sie verzögertes Laden in dieser Klasse implementieren müssen. Sie würden dann das Feld auf eine Eigenschaft umwandeln müssen. Von dem externen Modul Punkt ciew, könnte es die gleiche syntaxicaly aussehen, aber es ist nicht. Eine Eigenschaft ist ein Satz von Funktionen, während ein Feld einer in einer Klasseninstanz versetzt ist.

eine Eigenschaft Durch die Verwendung Sie das Risiko effektiv reduzieren die Schnittstelle ändern.

Das meist unten zu ihm kommt eine gemeinsame Codierung Konvention geworden. Es macht es einfach eine benutzerdefinierte Verarbeitung Code dann hinzufügen, wenn Sie es wünschen. Aber Sie sind richtig, gibt es technisch keine wirkliche Notwendigkeit dafür. Obwohl, wenn Sie später eine benutzerdefinierte Verarbeitung zu tun hinzufügen, dies wird Ihnen helfen, nicht die Schnittstelle zu brechen.

Diese Art der Notation ist nützlicher, wenn Sie acessibility für die Getter und Setter mischen. Zum Beispiel können Sie schreiben:

public int Foo { get; private set; }

Sie auch einen internen Setter setzen könnten, oder sogar den Getter privat machen und die Setter-Öffentlichkeit.

Diese Schreibweise vermeidet die Notwendigkeit, explizit eine private Variable schreibt nur das klassische Problem des intern beschreibbare / extern lesbaren Wertes zu behandeln.

Der Schlüssel ist, dass der Compiler die Eigenschaft ‚unter der Haube‘ in ein Funktionspaar übersetzt, und wenn Sie Code haben, sieht aus wie es die Eigenschaft hat mit es funktioniert tatsächlich aufrufen, wenn IL kompiliert unten.

Also lassen Sie uns sagen, dass Sie dies als ein Feld bauen und haben Code in einer separaten Assembly, die dieses Feld verwendet. Wenn später die Implementierung Änderungen und Sie es eine Eigenschaft, um die Änderungen aus dem Rest des Codes zu verstecken, müssen Sie noch neu kompilieren und erneut bereitstellen, die andere Baugruppe. Wenn es eine Eigenschaft von dem ist get-go dann werden die Dinge einfach funktionieren.

Ich denke, die Fragesteller zu fragen, warum die folgenden nicht tun ...

public string FirstName { }

Warum bei der Zugriffs- stören, wenn Sie es auf die oben verkürzen können. Ich denke, die Antwort ist, dass die Accessoren durch die Forderung an die Person, die es offensichtlich macht den Code zu lesen, dass es sich um ein Standard-get / set ist. Ohne sie können Sie sehen, oben ist es schwer, dies zu erkennen, wird automatisch umgesetzt werden.

Wenn Sie einen Fehler erhalten, und Sie müssen herausfinden, welche Methoden, um Ihre Felder ändern und wenn, werden Sie viel mehr interessieren. Leichtgewichtler Eigenschaft Putting Accessoren in vorne spart eine phänomenale Menge an Herzeleid soll Sie wickelten ein Fehler auftreten, das Feld beteiligt. Ich habe ein paar Mal in dieser Situation gewesen und es ist nicht angenehm, vor allem, wenn es sich herausstellt Neueintritt zusammenzuhängen.

tun, diese Arbeit im Voraus und einen Haltepunkt klebt auf einem Accessor ist viel einfacher als die Alternativen.

Für 99% der Fälle, ein öffentliches Feld auszusetzen ist in Ordnung.

Der gemeinsame Rat Felder verwenden: „Wenn Sie öffentliche Felder aus Ihren Klassen aussetzen Sie nicht später können sie auf Eigenschaften ändern“. Ich weiß, dass wir alle unsere Codes wollen zukunftssicher sein, aber es gibt einige Probleme mit diesem Denken:

  • Die Verbraucher Ihrer Klasse können sich wahrscheinlich neu kompilieren, wenn Sie Ihre Schnittstelle ändern.

  • 99% Ihrer Datenelemente müssen nie nicht-triviale Eigenschaften werden. Es ist spekulative Allgemeinheit . Sie sind eine Menge Code zu schreiben, die probaby nie von Nutzen sein wird.

  • Wenn Sie binäre Kompatibilität über Versionen benötigen, Datenelemente zu machen, um Eigenschaften wahrscheinlich nicht genug. Zumindest sollten Sie nur interfacess aussetzen und alle Konstrukteurs verstecken, und setzen Fabriken (siehe Code unten).


public class MyClass : IMyClass
{
    public static IMyClass New(...)
    {
        return new MyClass(...);
    }
}

Es ist ein schwieriges Problem, versucht, Code zu machen, die in einer ungewissen Zukunft arbeiten. Wirklich schwer.

Hat jemand ein Beispiel für eine Zeit, wenn triviale Eigenschaften mit Hilfe gerettet ihren Speck ?

Es die Kapselung des Objekts erhalten und den Code reduzieren einfacher zu sein, zu lesen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top