2339 Stimmen

Was ist der beste Weg, um eine C# Auto-Eigenschaft einen Anfangswert zu geben?

Wie gibt man einer C#-Auto-Eigenschaft einen Anfangswert?

Entweder verwende ich den Konstruktor, oder ich greife auf die alte Syntax zurück.

Verwendung des Konstruktors:

class Person 
{
    public Person()
    {
        Name = "Initial Name";
    }
    public string Name { get; set; }
}

Verwendung der normalen Eigenschaftssyntax (mit einem Anfangswert)

private string name = "Initial Name";
public string Name 
{
    get 
    {
        return name;
    }
    set
    {
        name = value;
    }
}

Gibt es einen besseren Weg?

6voto

OwenP Punkte 24128

Haben Sie versucht, die DefaultValueAttribute o ShouldSerialize und Reset Methoden in Verbindung mit dem Konstruktor? Ich habe das Gefühl, dass eine dieser beiden Methoden notwendig ist, wenn Sie eine Klasse erstellen, die auf der Designeroberfläche oder in einem Eigenschaftsraster erscheinen könnte.

4voto

Preet Singh Punkte 1651

Verwenden Sie den Konstruktor, weil "Wenn der Konstruktor beendet ist, sollte die Konstruktion beendet sein". Eigenschaften sind wie Zustände, die Ihre Klassen halten, wenn Sie einen Standardzustand initialisieren mussten, würden Sie das in Ihrem Konstruktor tun.

3voto

Zack Jannsen Punkte 622

Zur Klarstellung: Ja, Sie müssen im Konstruktor für von der Klasse abgeleitete Objekte Standardwerte festlegen. Sie müssen sicherstellen, dass der Konstruktor mit dem richtigen Zugriffsmodifikator für die Konstruktion vorhanden ist, wenn er verwendet wird. Wenn das Objekt nicht instanziiert wird, d.h. es hat keinen Konstruktor (z.B. statische Methoden), dann kann der Standardwert durch das Feld festgelegt werden. Der Grund hierfür ist, dass das Objekt selbst nur einmal erstellt wird und Sie es nicht instanziieren.

@Darren Kopp - gute Antwort, sauber und korrekt. Und um es noch einmal zu wiederholen: Sie KÖNNEN Konstruktoren für abstrakte Methoden schreiben. Sie müssen nur beim Schreiben des Konstruktors von der Basisklasse aus auf sie zugreifen:

Konstruktor der Basisklasse:

public BaseClassAbstract()
{
    this.PropertyName = "Default Name";
}

Konstrukteur bei Abgeleitet / Konkret / Unterklasse:

public SubClass() : base() { }

Der Punkt hier ist, dass die Instanzvariable, die von der Basisklasse gezogen wird, den Namen Ihres Basisfeldes begraben kann. Wenn Sie den Wert des aktuell instanziierten Objekts mit "this." festlegen, können Sie Ihr Objekt in Bezug auf die aktuelle Instanz und die erforderlichen Berechtigungsstufen (Zugriffsmodifikatoren) dort, wo Sie es instanziieren, korrekt gestalten.

3voto

Joel Coehoorn Punkte 377088

Das ist jetzt alt, und mein Standpunkt hat sich geändert. Ich lasse die ursprüngliche Antwort nur für die Nachwelt stehen.


Ich persönlich sehe keinen Sinn darin, es überhaupt zu einer Eigenschaft zu machen, wenn man über die Auto-Eigenschaft hinaus überhaupt nichts tun will. Lassen Sie es einfach als ein Feld. Die Vorteile der Kapselung für diese Elemente sind nur Ablenkungsmanöver, weil es nichts dahinter zu kapseln gibt. Wenn Sie jemals die zugrundeliegende Implementierung ändern müssen, steht es Ihnen immer noch frei, sie als Eigenschaften umzugestalten, ohne abhängigen Code zu verändern.

Hmm... vielleicht wird dies später Gegenstand einer eigenen Frage sein

5 Stimmen

@ Joel Datenbindung: Datenbindung und andere reflexionsbasierte Werkzeuge erwarten oft Eigenschaften und keine Felder.

13 Stimmen

Sie können ein Feld nicht in eine automatische Eigenschaft umwandeln, ohne den aufrufenden Code zu verändern. Es mag gleich aussehen, aber der generierte Code ist anders. Bei Auto-Eigenschaften ruft der aufrufende Code get_propname und set_propname hinter den Kulissen auf, während er bei einem Feld nur direkt auf das Feld zugreift.

1 Stimmen

Sie können auch nicht über AppDomain-Grenzen hinweg auf ein Feld zugreifen, sondern nur auf eine Eigenschaft oder Methode.

2voto

FloodMoo Punkte 39
public Class ClassName{
    public int PropName{get;set;}
    public ClassName{
        PropName=0;  //Default Value
    }
}

0 Stimmen

Dies wird bereits in der Frage selbst deutlich.

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