2009-09-08 13 views
5

Secondo la definizione:C# - Proprietà Chiarimento

"Poiché l'interfaccia non è un oggetto di per sé, non posso inizializzare it.If interfaccia sono stati autorizzati a dichiarare Campi, quindi ha bisogno posizione di memorizzazione , quindi non possiamo dichiarare campi nell'interfaccia. "

Incase della proprietà dicono esempio

quando dichiaro

string SayHello { get; set; } 

all'interno dell'interfaccia

è agganciato internamente come get_SayHello() ,set_SayHello() in IL (ove i disassemblare i può vedere i metodi get e set).

La mia domanda è ancora di proprietà ha bisogno di qualche posizione di memorizzazione, allora come la dichiarazione di proprietà

è consentito all'interno dell'interfaccia.

Edit: Questo è quello che understood.As Sono nuovo di C#, chiedo il vostro aiuto.

risposta

13

Si sta operando su un'ipotesi un po 'errata, che le proprietà richiedono un campo di supporto. Sì la maggior parte delle proprietà utilizza un campo di supporto, ma questo non è certamente un requisito. Posso per esempio implementare l'interfaccia con nessun campo supporto nel modo seguente

class C1 : IFoo { 
    public string SayHello { 
    get { return "Say Hello"; } 
    set { } 
    } 
} 
+3

@Downvoter, ti interessa dare un motivo? – JaredPar

+0

Probabilmente competitivo. – Skurmedel

+0

Ora è chiaro. Grazie – user160677

6

La dichiarazione di una proprietà in un'interfaccia dice che ogni classe che implementa deve avere tali metodi (get_SayHello e set_SayHello ma definiti come proprietà), ma non specifica come sono implementati. Cioè, l'interfaccia dice cosa puoi fare, ma ora come è fatto (così puoi ottenere la "stringa" SayHello, ed è possibile impostare la "stringa" SayHello). Quindi, per essere precisi: la definizione di una proprietà in un'interfaccia non dice nulla sui campi di backup.

Inoltre, è un equivoco che le proprietà debbano avere campi di backing. Ciò che segue non è:

class Example { 
    public string SayHello { 
     get { 
      return "Hello, World!"; 
     } 
     set { } 
    } 
} 

Le proprietà sono solo metodi accessibili tramite sintassi di tipo campo. Poiché sono metodi e non campi, sono definibili come interfaccia.

2

La mia domanda è ancora proprietà ha bisogno di un po 'di posizione di memorizzazione

Questo non è vero. Puoi fare tutto ciò che vuoi nei getter/setter. Dichiarando una proprietà in un'interfaccia, costringi semplicemente gli implementatori a fornire un getter e/o un setter.

1

Beh, una dichiarazione all'interno di un'interfaccia indica semplicemente quali membri possono esistere in un'istanza di tale interfaccia. Non ti dice nulla su come sono implementati o dove sono stati salvati.

Penso che tu abbia confuso il concetto di un'interfaccia con quella di una classe. Non istanziate le interfacce, ma le classi che le implementano.

4

Come dice Jared, la proprietà non ha necessariamente bisogno di alcuna posizione di archiviazione ... ma tu lo stai ancora pensando troppo, credo.

Immaginate la vostra interfaccia era in realtà:

public interface IFoo 
{ 
    string get_SayHello(); 
    string set_SayHello(string value); 
} 

metodi Just In un'interfaccia. Ne sei felice? Se è così, questa è tutta la proprietà, insieme a un po 'di metadati per legare insieme questi metodi. Niente a che vedere con i campi ... solo i metodi.

L'implementatore potrebbe voler utilizzare un campo, ma è completamente separato dall'interfaccia.

3

Dichiarare una proprietà di questo tipo in un'interfaccia significa semplicemente che per implementare tale proprietà sono necessarie tutte le classi definite dall'utente che implementano l'interfaccia. Queste classi sono libere di implementare la proprietà in qualsiasi modo tu ritenga opportuno (sia come proprietà automatiche, sia attraverso altri mezzi più complessi).

Modifica della proprietà nell'interfaccia al seguente:

string SayHello { get; } 

Le classi di attuazione sono necessari solo per implementare il getter per quella proprietà. Ma nessuna allocazione di storage è in corso a livello di interfaccia.

2

Non tutti i linguaggi .NET hanno il concetto di proprietà. Quindi le interfacce devono anche definire le versioni get_ e set_ della proprietà in modo che qualsiasi linguaggio .NET possa usare il tipo. Questo potrebbe aggiungere alla tua confusione.

+0

Come può un linguaggio non avere un concetto di proprietà, dato che avere una proprietà di lettura/scrittura in .net è (ahimè) diverso semanticamente dall'avere una proprietà di sola lettura e anche avere una scrittura solo proprietà? Ad esempio, dato 'IReadableFoo', con proprietà di sola lettura' Foo', e 'IWritableFoo', con una proprietà di sola scrittura con nome simile, un'interfaccia' IReadWriteFoo' che eredita entrambe deve, per essere utile, definire una terza lettura -Scrivi la proprietà. Come si farebbe in una lingua che non comprendeva le proprietà? – supercat

+0

@supercat: Non vedo come questo sia collegato a questa (terribile) risposta (che presto cancellerò) o alla domanda. La tua domanda ha una risposta in parte da "Conformità CLS" e in parte da "diavolo stai fumando?". – Will

+0

Se una lingua non conosce le proprietà, esiste un modo in cui può essere utilizzata per scrivere un'implementazione di un'interfaccia che ne contiene una? – supercat