Warum lässt C # Eigenschaften in Schnittstellen zu?

47

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?

Setzen Sie Monica wieder ein
quelle
12
Ist der Mangel an Staat einen der Grundsätze einer Schnittstelle Implementierung ? Eine Schnittstelle ist für mich eine Möglichkeit, einen Vertrag zu definieren. Wenn also eine Klasse eine solche Schnittstelle implementiert, verfügt sie über alle im Vertrag definierten Methoden und Eigenschaften.
Florian Margaine
4
Eine Eigenschaft ist nur eine get-Methode und eine set-Methode. Da Interfaces nur eine Liste von Methoden sind, die Sie implementieren müssen, können sie natürlich auch von Interfaces verwendet werden.
Doval
1
@FlorianMargaine Natürlich ist das Konzept eines Vertrags das wichtigste Prinzip von Schnittstellen, aber auch der Mangel an Status ist wichtig. Dies hilft, es von einer abstrakten Klasse zu trennen. In Java 8 ist dies der einzige große Unterschied zwischen Interfaces und abstrakten Klassen.
Setzen Sie Monica
2
@Doval: Es ist natürlich, dass eine Schnittstelle solche Methoden deklariert , aber nicht, dass sie implementiert.
Giorgio

Antworten:

65

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.

svick
quelle
18

Das Definieren der Eigenschaft wie gezeigt entspricht dem Definieren von Methoden int GetProperty()und void 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 Beispiel public string MyString { get; set;}- aber eine Eigenschaft , die benutzerdefinierte Logik in dem definiert getVerfahren 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.

NWard
quelle
Ahh ... Ich wusste nicht, dass es nur für Auto-Eigenschaften geschieht, und da Sie es überschreiben müssen, ist das sinnvoll. Wenn die Schnittstelle jedoch eine interne private Variable erstellen soll, haben die Implementierer keinen Zugriff darauf - ein offensichtliches Problem.
Setzen Sie Monica
9
Wenn Sie eine Eigenschaft in einer C # -Schnittstelle definieren, bleibt die Implementierung dieser Eigenschaft der implementierenden Klasse überlassen - sie können sie zu einer automatischen Eigenschaft machen oder benutzerdefinierte Logik definieren, wie sie es für richtig halten. Der Schnittstelle wird kein Feld hinzugefügt .
NWard
10

Eigenschaften sind Methoden! Der Klasse, die die Schnittstelle implementiert, wird ein Hintergrundfeld hinzugefügt (entweder manuell oder über eine automatische Eigenschaft).

Roman Reiner
quelle
Manchmal gibt es kein Hintergrundfeld. Es wäre jedoch selten, sowohl ein get als auch ein set zu definieren und kein Hintergrundfeld dafür zu haben.
Stephen
+1 Eigenschaften sind Methoden! Ja! Ich schreibe gerne Propertymethods, aber Mitarbeiter, die sich mit der Codeüberprüfung befassen, sehen das nicht so und wir verpassen wirklich die Möglichkeit, in unseren Programmen ein paar schöne, ausdrucksstarke Kapselungen zu finden.
Radarbob
Diese "Eigenschaftsmethoden" sollten jedoch schnell sein, wie keine DB-Lookups oder ähnliches. Es gibt einen impliziten Vertrag, wonach der Zugriff auf Eigenschaften schnell ist. Get * -Methoden können langsam sein.
Trey Mack