Auto-Eigenschaften und Strukturen
Ich wundere mich über die folgende C#-code:
struct Structure
{
public Structure(int a, int b)
{
PropertyA = a;
PropertyB = b;
}
public int PropertyA { get; set; }
public int PropertyB { get; set; }
}
Es ist nicht das kompilieren mit einem Fehler "Der" this "- Objekt kann nicht benutzt werden, bevor alle seine Felder zugewiesen sind". Für die analoge Klasse kompilieren ohne Probleme.
Es gemacht werden kann die Arbeit durch die Umgestaltung der folgenden:
struct Structure
{
private int _propertyA;
private int _propertyB;
public Structure(int a, int b)
{
_propertyA = a;
_propertyB = b;
}
public int PropertyA
{
get { return _propertyA; }
set { _propertyA = value; }
}
public int PropertyB
{
get { return _propertyB; }
set { _propertyB = value; }
}
}
Aber, ich dachte, dass der springende Punkt bei der Einführung von auto-Eigenschaften auf die C# - war zu vermeiden, schriftlich später-code. Bedeutet das, dass auto-Eigenschaften sind nicht relevant für die Strukturen?
- Welche version von .Netz verwenden Sie?
- Jedes mal, wenn Sie schreiben eine veränderliche Struktur, weint jemand
- es wird nicht egal... das Verhalten ist das gleiche auf jedem; das ist ein C# - 3.0-compiler-Funktion und das "fix" ist, wie Stefan pro
- mögliche Duplikate von Automatische Eigenschaften und Strukturen nicht Mischen?
- Hinweis: dies ist nicht mehr ein Problem in C# 6
Du musst angemeldet sein, um einen Kommentar abzugeben.
In C# 6, dies geht einfach Weg; der code in der Frage kompiliert einwandfrei.
Während Stefan hat die Antwort als auf die Frage eingegangen, ich haben beraten Sie nicht auf eine veränderliche Struktur - es wird beißen. Mutable structs sind böse.
IMO, die "richtige" Lösung ist einfach:
PropertyA { get; private set; }
. Readonly erhält man sehr wenig – es ist fast immer trivial zu vermeiden, die Einstellung Ihrer Eigenschaften mehr als einmal. Und wenn Sie nichtreadonly
bist du immer noch mit automatisch implementierten Eigenschaften, also das problem ist immer noch relevant.:this()
:this()
mehrstruct Foo { Foo(int x) : this() { X = x; } public int X { get; private set; }
readonly
denn die meisten von dem, was Sie Tat, war nur meine Objekte weniger sauber.struct
oderpublic
oder der Konstruktor Körper. Ich habe nie vorgeschlagen, Sie verlassen konnte, diethis()
rufen, so bin ich nicht sicher, warum Sie sind Entdeckung es aus.Müssen Sie zum Aufruf der default-Konstruktor wird zunächst, etwa so:
Wie Sie gesehen haben, wenn Sie von sich
PropertyA
im Konstruktor, greifen Sie auf diethis
Objekt, das der compiler wird nicht zulassen, denn Ihre Felder wurden noch nicht initialisiert, noch nicht.Um dies zu umgehen, müssen Sie einen Weg finden, die Felder zu initialisieren. Eine Möglichkeit ist, Ihrem Beispiel: Wenn Sie nicht auto-Eigenschaften, dann die Felder sind explizite und Sie können initialisieren.
Einen anderen Weg zu Ihrem Konstruktor ein Konstruktor, initialisiert die Felder. Strukturen immer implizit einen parameterlosen Konstruktor, initialisiert seine Felder zu null, so verwenden, dass: