c #: Getter / Setter

109

Ich sah irgendwo so etwas wie das Folgende und fragte mich, was es bedeutete. Ich weiß, dass sie Getter und Setter sind, möchte aber wissen, warum der String-Typ so definiert ist. Danke für die Hilfe.

public string Type { get; set; }
Maya
quelle
4
Dies wird als Auto-Eigenschaft bezeichnet. Sehen Sie sich dies an: msdn.microsoft.com/en-us/library/bb384054.aspx
Allov
Dies ist die Definition einer Eigenschaft mit dem Namen "Type".NET System.string. Da ist nichts mehr dran.
Jon
2
Ich denke, dass er die Benennung der Auto-Eigenschaft mit der Reflection-Klasse System.Type verwechseln könnte. msdn.microsoft.com/en-us/library/system.type.aspx
eandersson

Antworten:

178

Dies sind automatisch implementierte Eigenschaften (kurz Auto-Eigenschaften).

Der Compiler generiert automatisch das Äquivalent der folgenden einfachen Implementierung:

private string _type;

public string Type
{
    get { return _type; }
    set { _type = value; }
}
Justin Niessner
quelle
2
@barlop als jemand von Google, ohne Ahnung, was muss aktualisiert werden? Antwortet M. Hassans, was Sie meinen? Vielen Dank.
Aethenosity
1
@Aethenosity im Nachhinein Ich denke, es ist in Ordnung .. Ich dachte in Bezug auf Beispiele von Getter Setter. Der Fragesteller hat einen gültigen Fall eines Getter-Setzers, der weitaus prägnanter ist (als Einzeiler / kein zweites Feld erforderlich). Sie können auch public int b { get { return b * 2; } } kein zweites Feld schreiben . Aber ich denke, wenn Sie den Setter mit einem Körper haben, dann brauchen Sie das zweite Feld. Und dieser zeigt einen Setter mit einem Körper. Obwohl es das gleiche tut wie der Einzeiler des Fragestellers.
Barlop
2
@Aethenosity gibt es auch c # 7, wobei sicher ist, dass Sie das zweite Feld noch benötigen, wenn der Setter einen Body hat, aber eine =>Syntax und kein return-Schlüsselwort. Obwohl ich das nicht im Sinn hatte. Ich dachte daran, dass das zweite Feld unnötig ist, obwohl ich seitdem festgestellt habe, dass das zweite Feld manchmal notwendig ist. In dem Beispiel hier ist das zweite Feld nicht erforderlich (weil ein Standardsetzer ohne Körper dies tun würde), aber der Antwortende hat es eingegeben (Setterkörper und zweites Feld), um dem Fragesteller zu erklären, was ihre Zeile ohne das ist Das zweite Feld war fertig.
Barlop
33

Das ist eine Auto-Eigenschaft und es ist die Kurzschreibweise dafür:

private string type;
public string Type
{
  get { return this.type; }
  set { this.type = value; }
}
Teoman Soygul
quelle
4
... außer dass das Hintergrundfeld nicht zugänglich ist.
Vlad
7
... weshalb es als Hintergrundfeld bezeichnet wird .
Teoman Soygul
5
Trotzdem sollte man es wie <Type>k__BackingFieldmit Reflexion sehen können.
Vlad
25

In C # 6:

Es ist jetzt möglich, die Auto-Eigenschaften nur als Feld zu deklarieren:

public string FirstName { get; set; } = "Ropert";

Schreibgeschützte Auto-Eigenschaften

public string FirstName { get;} = "Ropert";
M. Hassan
quelle
13
public string Type { get; set; } 

Ist nicht anders als zu tun

private string _Type;

public string Type
{    
get { return _Type; }
set { _Type = value; }
}
Sicherheitshund
quelle
5

Es ist eine automatisch gesicherte Eigenschaft, die im Grunde gleichbedeutend ist mit

private string type;
public string Type
{
   get{ return type; }
   set{ type = value; }
}
Jamiec
quelle
4

Diese werden als automatische Eigenschaften bezeichnet.

http://msdn.microsoft.com/en-us/library/bb384054.aspx

Funktionell (und in Bezug auf die kompilierte IL) sind sie dieselben wie Eigenschaften mit Hintergrundfeldern.

Jeff
quelle
1
Können Sie immer noch auf den privaten _Typ oder Typ innerhalb der Klasse verweisen oder verwenden Sie einfach Typ?
Mikey
2
Nein, ABER Sie können den Modifikator für die Eigenschaft auto angeben: public string Type {get; privates Set; }
Jeff
In diesem Fall können Sie nicht auf _type zugreifen.
Sicherheitshund
1
In diesem Fall also this.Type = "foo"; sollte in Ordnung sein, aber von außerhalb der Instanz.Type = "foo"; wird nicht .. Diese Auto-Requisiten sind definitiv eine hilfreiche Ergänzung der Sprache. Vielen Dank.
Mikey
1

Ich weiß, dass dies eine alte Frage ist, aber mit der Veröffentlichung von C # 6 können Sie jetzt so etwas für private Immobilien tun.

public constructor()
{
   myProp = "some value";
}

public string myProp { get; }
Anonym
quelle
2
Sie können den Anfangswert direkt in C # 6 festlegen: public string myProp {get; } = "irgendein Wert") ohne Konstruktor;
M. Hassan
1

Sie können auch einen Lambda-Ausdruck verwenden

public string Type
{
    get => _type;
    set => _type = value;
}
Ahmad Aghazadeh
quelle