Wie geben Sie einer C # -Auto-Eigenschaft einen Standardwert?
Wie geben Sie eine C# - Auto-Eigenschaft einen Standardwert? Entweder nutze ich den Konstruktor, oder wieder die alte syntax.
Mit dem Konstruktor:
class Person
{
public Person()
{
Name = "Default Name";
}
public string Name { get; set; }
}
Mit der normalen syntax der Eigenschaft (mit einem default-Wert)
private string name = "Default Name";
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
Gibt es eine bessere Möglichkeit?
InformationsquelleAutor der Frage bentford | 2008-09-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
In C# 5 und früher zu geben, die automatisch implementierten Eigenschaften einen Standardwert, den Sie haben, es zu tun in einem Konstruktor.
Die Fähigkeit zu haben, die Eigenschaft auto-Initialisierungen enthalten ist, da C# 6.0. Die syntax ist:
InformationsquelleAutor der Antwort Darren Kopp
Bearbeiten 1/2/15
Mit C# 6 können Sie eine Initialisierung von auto-properties direkt (endlich!), es gibt jetzt die anderen Antworten in dem thread, beschreiben.
C# 5 und unten:
Obwohl die beabsichtigte Verwendung des Attributs ist nicht eigentlich die Werte der Eigenschaften, die Sie verwenden können, Reflexion, immer legen Sie Sie sowieso...
InformationsquelleAutor der Antwort Chuck Rostance
Beim inline ein initialer Wert für eine variable wird implizit im Konstruktor sowieso.
Ich würde behaupten, dass diese syntax wurde beste Praxis in C# - bis zu 5:
Wie dieses gibt Ihnen eine klare Kontrolle der auftragswerte zugewiesen werden.
Als von C#6 gibt es einen neuen Weg:
InformationsquelleAutor der Antwort Keith
DefaultValueAttribute NUR die Arbeit in der vs-designer. Es wird nicht initialisiert die Eigenschaft, Wert.
Sehen DefaultValue-Attribut nicht funktioniert mit meiner Auto-Eigenschaft
InformationsquelleAutor der Antwort Darren Kopp
Manchmal benutze ich diese, wenn ich nicht wollen, es zu sein wirklich festlegen und beibehalten, in meiner db:
Natürlich, wenn es nicht einen string, dann könnte ich das Objekt nullable ( Doppel -?, int? ) und überprüfen, ob es null zurückgeben und den Standardwert, oder geben den Wert zurück gesetzt.
Dann kann ich schauen Sie in meinem repository, um zu sehen, ob es mein Standard-und nicht bleiben, oder machen Sie einen backdoor-check-in, um zu sehen, der wahre status der backing-Wert vor dem speichern.
Hoffe, das hilft!
InformationsquelleAutor der Antwort crucible
Beginnend mit C# 6.0die Wir zuordnen können, Standardwert, der automatisch implementierten Eigenschaften.
Wir können auch Lesen-nur automatisch implementierte Eigenschaft wie:
Finden Sie unter: C# 6: Erste Reaktionen , Initialisierungen, die für die automatisch implementierten Eigenschaften - Von Jon Skeet
InformationsquelleAutor der Antwort Habib
In C# 6.0 ist dies ein Kinderspiel!
Können Sie tun es in der
Class
Erklärung selbst, in der Eigenschaft Erklärung Erklärungen.InformationsquelleAutor der Antwort Shiva
kleines vollständiges Beispiel:
InformationsquelleAutor der Antwort ghiboz
In der Version von C# (6.0) & mehrdie Sie tun können :
Für Readonly-Eigenschaften
Für beide Beschreibbar & Lesbare Eigenschaften
In der aktuellen Version von C# (7.0)die Sie tun können : (Das snippet eher zeigt, wie Sie mit expression-bodied get/set-Accessoren zu machen ist kompakter als bei der Verwendung von backing-Felder)
InformationsquelleAutor der Antwort ANewGuyInTown
Meine Lösung ist ein benutzerdefiniertes Attribut, das bietet die Standard-Eigenschaft value Initialisierung von Konstanten oder mithilfe von property-typeninitialisierer.
Verwenden Sie dieses Attribut, es ist notwendig, um eine Klasse Erben von der speziellen Basis-Klassen-Initialisierer oder verwenden Sie eine statische Hilfsmethode:
Beispiel:
Ausgabe:
InformationsquelleAutor der Antwort introspected
Zusätzlich zu der Antwort schon akzeptiert, für das Szenario, wenn Sie wollen, definieren Sie eine Standard-Eigenschaft als Funktion von anderen Eigenschaften, die Sie verwenden können, Ausdruck Körper notation auf C#6.0 (und höher) für noch mehr elegante und präzise Konstrukte wie:
Können Sie verwenden die oben in der folgenden Weise
Um der Lage sein, um das "=>" - notation, die Eigenschaft muss nur gelesen werden, und Sie nicht mit der get-accessor Stichwort.
Details auf MSDN
InformationsquelleAutor der Antwort brakeroo
In C# 6 und höher können Sie einfach die syntax:
Beachten Sie, dass eine
readonly
Eigenschaft einfach weglassen, also:Können Sie auch zuweisen
readonly
auto-Eigenschaften aus dem Konstruktor.Vor diesem habe ich geantwortet, als unten.
Ich möchte vermeiden, das hinzufügen einer Voreinstellung an den Konstruktor; verlassen Sie, dass für dynamische Zuweisungen und vermeiden, dass zwei Punkte, an denen die variable zugeordnet ist (dh den Typ Standard und im Konstruktor). Normalerweise würde ich schreiben einfach eine normale Eigenschaft, in solchen Fällen.
Eine andere Möglichkeit ist, das zu tun, was ASP.Net macht und definieren Sie Standardwerte über ein Attribut:
http://msdn.microsoft.com/en-us/library/system.componentmodel.defaultvalueattribute.aspx
InformationsquelleAutor der Antwort Lex
In den Konstruktor. Der Konstruktor hat den Zweck, initialisiert es die Daten der Mitglieder.
InformationsquelleAutor der Antwort RayLoveless
Haben Sie versucht, mit dem DefaultValueAttribute oder ShouldSerialize-und Reset-Methoden in Verbindung mit dem Konstruktor? Ich fühle mich wie einer dieser beiden Methoden ist notwendig, wenn Sie eine Klasse, die könnte zeigen, bis auf der Oberfläche des Designers oder in einer property-grid.
InformationsquelleAutor der Antwort OwenP
InformationsquelleAutor der Antwort FloodMoo
Persönlich, ich sehe nicht den Punkt, an dem es eine Eigenschaft überhaupt, wenn du nicht gehst, zu tun, überhaupt nichts über die auto-Eigenschaft. Lassen Sie es als ein Feld. Die Kapselung nutzen für diese Artikel sind nur Ablenkungsmanöver, denn es gibt nichts hinter Ihnen zu fassen. Wenn Sie jemals brauchen werden, um die zugrundeliegende Implementierung sind Sie noch frei umgestalten, Sie als Eigenschaften, ohne zu brechen alle abhängigen code.
Hmm... vielleicht wird dies das Thema der eigenen Frage später
InformationsquelleAutor der Antwort Joel Coehoorn
Zu klären, ja, müssen Sie default-Werte in den Konstruktor der Klasse abgeleitete Objekte. Sie müssen sicherstellen, dass die Konstruktor vorhanden ist, mit der richtigen access-modifier für den Bau verwendet. Wenn das Objekt nicht instanziiert, z.B. es hat keinen Konstruktor (z.B. statische Methoden), dann wird der default-Wert kann eingestellt werden, indem das Feld. Die Argumentation ist hier, dass das Objekt selbst wird nur einmal erstellt werden und Sie nicht instanziert.
@Darren Kopp - gute Antwort, sauber und korrekt. Und um zu wiederholen, KÖNNEN Sie schreiben Konstruktoren für Abstrakte Methoden. Sie brauchen nur Zugang zu Ihnen von der Basis-Klasse beim schreiben der Konstruktor:
Konstruktor an der Basis-Klasse:
Konstruktor bei Abgeleiteten /Beton /Sub-Klasse:
Der Punkt hier ist, dass die Instanz-variable gezeichnet von der Basisklasse kann, begraben Sie Ihre Basis-Feld-Namen. Einstellung der aktuellen instanziierte Objekt Wert mit "." wird Ihnen zulassen, korrekt bilden, Ihren Gegenstand mit Bezug auf die aktuelle Instanz und die erforderlichen Berechtigungsstufen (access-modifiers), wo Sie instanziieren.
InformationsquelleAutor der Antwort Zack Jannsen
Verwenden Sie den Konstruktor, weil "Wenn der Konstruktor fertig ist, sollten Bau fertig sein". Eigenschaften sind wie Staaten Ihre Klassen halten, wenn Sie hatte zu initialisieren einer default-Zustand ist, Sie würde tun, die in Ihrem Konstruktor.
InformationsquelleAutor der Antwort Preet Singh
InformationsquelleAutor der Antwort Nag
Ich denke, das würde es für ya givng SomeFlag den Standardwert false.
InformationsquelleAutor der Antwort user3076134
initialisieren in der Linie mit Konstruktoren zu initialisieren, ist eine schlechte Gewohnheit und führt zu mehr wichtige änderungen später.
InformationsquelleAutor der Antwort dbobrowski