Wenn sowohl get als auch set in automatischen C#-Eigenschaften obligatorisch sind, warum muss ich mir dann überhaupt die Mühe machen, "get; set;" anzugeben?
Sie können auch alle Arten von Modifikatoren hinzufügen, wie z. B. geschützt usw.
Wenn sowohl get als auch set in automatischen C#-Eigenschaften obligatorisch sind, warum muss ich mir dann überhaupt die Mühe machen, "get; set;" anzugeben?
Ja, und was andere Leute gesagt haben... Sie brauchen einen Weg, um zwischen einem Feld und einer Eigenschaft zu unterscheiden.
Eine kleine Randbemerkung: Es gibt das Konzept der schreibgeschützten Felder. Das Framework sorgt dafür, dass diese nur einmal geschrieben werden. Dies unterscheidet sich von privaten Settern oder Gettern, die geschrieben werden können, wenn Sie Zugriff haben.
ERROR: Eine Eigenschaft oder ein Indexer darf nicht als out- oder ref-Parameter übergeben werden
Wenn Sie keine Angaben gemacht haben {get; set;}
dann würde der Compiler nicht wissen, ob es sich um ein Feld oder eine Eigenschaft handelt. Dies ist wichtig, da sie zwar identisch aussehen, aber vom Compiler unterschiedlich behandelt werden. z.B. führt der Aufruf von "InitAnInt" für die Eigenschaft zu einem Fehler.
class Test
{
public int n;
public int i { get; set; }
public void InitAnInt(out int p)
{
p = 100;
}
public Test()
{
InitAnInt(out n); // This is OK
InitAnInt(out i); // ERROR: A property or indexer may not be passed
// as an out or ref parameter
}
}
Sie sollten keine öffentlichen Felder/Variablen in Klassen erstellen. Man weiß nie, wann man sie ändern möchte, um Get- und Set-Accessors zu haben, und dann weiß man nicht, welchen Code man kaputt macht, vor allem, wenn man Clients hat, die gegen Ihre API programmieren.
Sie können auch verschiedene Zugriffsmodifikatoren für get und set verwenden, z.B. {get; privat set;} macht "get" öffentlich und "set" privat für die deklarierende Klasse.
Ich dachte, ich würde meine Erkenntnisse zu diesem Thema mitteilen.
Eine Eigenschaft wie die folgende zu kodieren, ist eine .net 3.0 Abkürzung, die " selbst-implementierte Eigenschaft ".
public int MyProperty { get; set; }
Dies erspart Ihnen einige Tipparbeit. Der lange Weg, eine Eigenschaft zu deklarieren, ist wie folgt:
private int myProperty;
public int MyProperty
{
get { return myProperty; }
set { myProperty = value; }
}
Wenn Sie die "auto-implementierte Eigenschaft" verwenden, generiert der Compiler den Code, um das Get und Set mit einem "k_BackingField" zu verbinden. Unten ist der zerlegte Code mit Reflector zu sehen.
public int MyProperty
{
[CompilerGenerated]
get
{
return this.<MyProperty>k__BackingField;
}
[CompilerGenerated]
set
{
this.<MyProperty>k__BackingField = value;
}
}
disassemblierter C#-Code aus IL
Außerdem wird eine Methode für den Setter und Getter verdrahtet.
[CompilerGenerated]
public void set_MyProperty(int value)
{
this.<MyProperty>k__BackingField = value;
}
[CompilerGenerated]
public int get_MyProperty()
{
return this.<MyProperty>k__BackingField;
}
disassemblierter C#-Code aus IL
Wenn Sie eine nur lesbare, automatisch implementierte Eigenschaft deklarieren, indem Sie den Setter auf privat setzen:
public int MyProperty { get; private set; }
Der Compiler markiert lediglich die " einstellen. " als privat. Die Setter- und Getter-Methode sagen dasselbe.
public int MyProperty
{
[CompilerGenerated]
get
{
return this.<MyProperty>k__BackingField;
}
private [CompilerGenerated]
set
{
this.<MyProperty>k__BackingField = value;
}
}
disassemblierter C#-Code aus IL
Ich bin mir also nicht sicher, warum der Rahmen sowohl get; als auch set; für eine automatisch implementierte Eigenschaft erfordert. Sie könnten einfach nicht die Set und Setter-Methode geschrieben haben, wenn es nicht geliefert wurde. Aber es kann einige Compiler-Ebene Problem, das dies schwierig macht, ich weiß es nicht sein.
Wenn Sie sich den langen Weg der Deklaration einer schreibgeschützten Eigenschaft ansehen:
public int myProperty = 0;
public int MyProperty
{
get { return myProperty; }
}
Und dann sehen Sie sich den disassemblierten Code an. Der Setter ist überhaupt nicht vorhanden.
public int Test2
{
get
{
return this._test;
}
}
public int get_Test2()
{
return this._test;
}
disassemblierter C#-Code aus IL
Die private set-Methode ist bei Auto-Eigenschaften erforderlich, weil man sonst den Wert nie auf irgendetwas setzen könnte, was sinnlos wäre. Sie können den Setter von einer nicht-automatischen Eigenschaft ausschließen, da das Hintergrundfeld eine Möglichkeit bietet, den Wert intern zu ändern.
Einverstanden. Die Syntax ist wahrscheinlich teilweise darauf zurückzuführen, daß Herr Anders kein neues Schlüsselwort in die Sprache einführen wollte.
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.