In C # ist der folgende Code gültig
interface I{
int property{get;set;}
}
Was für mich keinen Sinn ergibt. Dies scheint eines der wichtigsten Prinzipien von Schnittstellen zu brechen: mangelnder Zustand (dh keine Felder). Erstellt die Eigenschaft kein implizites privates Feld? Wäre das nicht wirklich schlecht für Schnittstellen?
c#
interfaces
properties
Setzen Sie Monica wieder ein
quelle
quelle
Antworten:
Ich denke, der verwirrende Teil ist, dass, wenn Sie
int Property { get; set; }
innerhalb einer Klasse schreiben , es eine automatische Eigenschaft mit implizitem Hintergrundfeld ist.Wenn Sie jedoch genau dasselbe in eine Schnittstelle schreiben, handelt es sich nicht um eine Auto-Eigenschaft , sondern um eine Deklaration, dass die Eigenschaft Teil der Schnittstelle ist und dass jeder Typ, der die Schnittstelle implementiert, diese Eigenschaft enthalten muss (als Auto-Eigenschaft oder nicht) ), aber das Hintergrundfeld wird nicht erstellt.
Ein Weg, um den Unterschied zu erkennen, ist das Schreiben
int Property { get; }
: Dies ist in einer Schnittstelle gültig und deklariert eine Eigenschaft, die nur einen Getter, aber keinen Setter enthält. Es wird jedoch nicht in einer Klasse kompiliert (es sei denn, Sie verwenden C # 6.0), da die automatische Eigenschaft einen Setter haben muss.quelle
Das Definieren der Eigenschaft wie gezeigt entspricht dem Definieren von Methoden
int GetProperty()
undvoid SetProperty(int i)
. Eigenschaften sind leistungsfähige Abkürzungen in C #.Eine Eigenschaft erstellt implizit kein privates Feld in C #. Das ist die Standardimplementierung eines ist
auto-property
, zum Beispielpublic string MyString { get; set;}
- aber eine Eigenschaft , die benutzerdefinierte Logik in dem definiertget
Verfahren keine implizite privates Feld erzeugen.Was wäre schließlich von Bedeutung, wenn sich die Implementierung einer Interface-Eigenschaft auf ein privates Feld stützen würde , da es sich bei Interfaces um öffentliche APIs handelt - implizit oder anderweitig? Das ist den Verbrauchern der Schnittstelle egal verborgen.
quelle
Eigenschaften sind Methoden! Der Klasse, die die Schnittstelle implementiert, wird ein Hintergrundfeld hinzugefügt (entweder manuell oder über eine automatische Eigenschaft).
quelle