Frage

In C # können Sie Getter / Setter auf einfachere Art und Weise als andere Sprachen erstellen:

public int FooBar { get; set; }

Dies erzeugt eine interne private Variable, die Sie nicht direkt mit der externen Eigenschaft ansprechen können ‚FooBar‘ direkt zugreifen zu können.

Meine Frage ist - wie oft Sie diesen missbraucht sehen? Es scheint, wie es ein hohes Potential hat oft Verkapselung Best-Practices zu verletzen. Verstehen Sie mich nicht falsch, ich benutze es als angemessen, und teilweise Variationen davon für Nur-Lese-Schreib nur Arten von Immobilien, aber was ist Ihre unangenehmen Erfahrungen mit von anderen Autoren in der Code-Basis?

Klarstellung:. Die beabsichtigte Definition des Missbrauchs in der Tat eine solche Eigenschaft erschaffen würde, wenn private Variablen sind entsprechende

War es hilfreich?

Lösung

Ich habe gesehen, es missbraucht (meiner Meinung nach). Insbesondere dann, wenn der Entwickler würde normal schreiben:

private readonly int foo;
public int Foo
{ 
    get 
    { 
        return foo;
    }
}

sie werden manchmal schreiben:

public int Foo { get; private set; }

Ja, es ist kürzer. Ja, von außerhalb der Klasse hat es das gleiche Aussehen - aber ich weiß nicht diese als die gleiche Sache betrachten, da diese Form der Eigenschaft ermöglicht in der gleichen Klasse gesetzt anderswo werden. Es bedeutet auch, dass es keine Warnung ist, wenn die Eigenschaft nicht im Konstruktor festgelegt ist, und das Feld ist nicht nur lesbar für die CLR. Dies sind subtile Unterschiede, aber nur gehen für die zweite Form, weil es einfacher ist, und ignorieren die Unterschiede fühlt sich an wie Missbrauch zu mir, auch wenn es kleinere.

Glücklicherweise ist dies jetzt als von C # 6:

// Foo can only be set in the constructor, which corresponds to a direct field set
public int Foo { get; }

Andere Tipps

Es gibt keinen „Missbrauch“ in nicht einfach das Feld manuell zu schreiben; und es ist gut, alle Zugriffe über das Eigentum (nicht direkt auf das Feld) zu ermutigen, auf jeden Fall!

Das größte Problem, das ich kenne ist mit binärer Serialisierung , wo es ein bisschen schwierig wird wieder zu einem regelmäßigen Feld zu ändern, ohne dass es versions unvereinbar zu machen - aber dann ... einen anderen Serializer ;-p verwenden

Es wäre schön, wenn es eine „richtige“ Read-only-Variante ist, und wenn Sie nicht :this() Ctor Verkettungs auf structs verwenden, aber .... meh!

Ich habe keinen Missbrauch davon gesehen. Und um ehrlich zu sein, ich weiß nicht wirklich, was Sie meinen, wie ich kann nicht sehen, wie diese Syntax missbraucht werden könnte.

Ich glaube nicht, automatische Eigenschaften sind schlechter als regelmäßige Eigenschaften in Bezug auf die Verkapselung.

Wenn Sie meinen, dass einige Entwickler verwenden öffentliche automatische Eigenschaften stattdessen private Felder, dann ist dies natürlich falsch und bricht Verkapselung ..

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