23 Stimmen

Privater Satz oder privates Mitglied?

Ich habe mich gefragt, was als bewährte Praxis in C# betrachtet wird, private/geschützte Member mit öffentlichen Gettern oder öffentliche Getter mit privaten/geschützten Settern?

public int PublicGetPrivateSetter
{
     get;
     private set;
}

private int _privateMember;

public int PublicGetPrivateMember
{
    get { return _privateMember; }
}

Ich finde, dass die Verwendung eines privaten Members in Ihrem Code expliziter macht, dass es sich um einen privaten Setter handelt (unter Verwendung von Namenskonventionen). Andererseits ermöglicht die Verwendung von privaten Settern die Verwendung von virtuellen (geschützten), die Schreibweise von weniger Code, bietet weniger Raum für Fehler und bietet Ihnen die Möglichkeit, später ein Seiteneffekt hinzuzufügen, wenn Sie es benötigen.

Ich konnte keine bewährte Praxis finden oder sogar feststellen, ob eine besser ist als die andere. Von dem, was ich gesehen habe, verwenden Menschen in der Regel 80% der Zeit (aus dem Code, den ich gesehen habe) keine privaten Setter... Ich bin mir nicht sicher, ob dies daran liegt, dass die Leute nichts über private Setter wissen, oder ob es als besser erachtet wird, tatsächlich private Member zu verwenden.

EDIT:

Tatsächlich gibt es weitere Vorteile, die ich vergessen habe, wenn man private Member verwendet, z.B. Standardwerte und die Verwendung von readonly.

34voto

Mark Byers Punkte 761508

Ich ziehe es vor, auto-implementierte Eigenschaften zu verwenden, es sei denn, die Standardimplementierung tut nicht das, was ich will. In diesem Fall, da die auto-implementierte Eigenschaft tut, was Sie brauchen, verwenden Sie einfach diese:

public int Foo { get; private set; }

Eine andere Situation ist jedoch, wenn Sie das Feld readonly machen möchten (was bedeutet, dass das Feld nur im Konstruktor festgelegt werden kann). Dann müssen Sie das Backing Field definieren und als readonly markieren, da dies von auto-implementierten Eigenschaften nicht unterstützt wird:

private readonly int foo;

public int Foo
{
    get { return foo; }
}

0voto

Meligy Punkte 34091

Es gibt keine Best Practice, von der ich weiß. Ich weiß, dass automatische Eigenschaften hauptsächlich dazu dienen, Dinge noch einfacher für die Codegenerierung und LINQ-bezogene Dinge zu machen.

Für mich beginne ich mit automatischen Eigenschaften und refaktoriere später bei Bedarf. Je nach Bedarf ändere ich möglicherweise etwas in virtuell oder geschützt, wie Sie erwähnt haben, oder refaktoriere möglicherweise, um eine Variable zu verwenden (wenn ich den Set-Accessor refaktorisieren möchte, um einige Logik zu haben).

0voto

Ritch Melton Punkte 11318

Es ist dasselbe. Im ersten Beispiel generiert der Compiler den Backing Store. Im zweiten Beispiel haben Sie den Backing Store generiert. Da die Implementierung intern in der Klasse ist, ist es kein großes Problem, eine in die andere zu refactorieren. Tools wie Resharper machen das trivial. Der Grund, warum Sie wahrscheinlich nicht so viele private Setter gesehen haben, ist, dass es sich um ein C# 3.0-Feature handelt.

0voto

Davita Punkte 8610

Es ist nichts falsch mit privaten Setzern. In den meisten Fällen wird es mit automatischen Eigenschaften verwendet, um die Eigenschaft außerhalb des Bereichs des Objekts schreibgeschützt zu machen.

0voto

Coincoin Punkte 26516

Vom konzeptionellen Standpunkt aus ändert es nichts. Es ist größtenteils eine Geschmacksfrage.

Ich persönlich verwende den privaten Setter, weil ich faul bin und das propg-Snippet oft benutze. (propg tab tab)

Außerdem setze ich oft Dirty-Flags und binde Ereignisse an diese Eigenschaften, also kann ich genauso gut einen Teil der Arbeit jetzt erledigen. Wenn Sie später einen Setter hinzufügen müssen, ist es viel einfacher, wenn der Code ohne Verwendung des Mitglieds dahinter geschrieben ist, da weniger Code geändert werden muss.

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