2009-05-20 4 views
5

In .NET proprietà dovrebbero essere cittadini di prima classe invece nel codice IL getter di proprietà e setter sono implementate come get_PropertyName e set_PropertyName.Perché i setter e i getter della proprietà si scontrano con i metodi get_X e set_X?

class Property 
{ 
    int Value { get { return 42; } } 
    int get_Value() { return 6 * 9; } 
    void set_Value(int i) { } // Error even though Value is a read only property 
} 

uscita:

errore CS0082: Tipo 'SO.Property' si riserva già un utente chiamato 'Get_Value' con gli stessi tipi di parametri

errore CS0082: il tipo 'SO. Proprietà 'prenota già un membro chiamato' set_Value 'con gli stessi tipi di parametro

Perché il des le accensioni di .NET decidono di utilizzare un nome che potrebbe interferire con il codice utente? Avrebbero potuto usare un carattere illegale (come Java utilizza $ per le cose di classe interna).

+6

I formati get_Value() e set_Value() vanno anche contro le convenzioni di denominazione C# (http://msdn.microsoft.com/en-us/library/ms229045.aspx): "Non utilizzare caratteri di sottolineatura, trattini o qualsiasi altro carattere nonalfanumerico. " Potrebbe essere proprio a causa di questo problema, ma il punto è che non dovresti usare questo formato nel tuo codice C#. – alastairs

risposta

8

Per le lingue che non hanno il concetto di proprietà, come J # (che può benissimo aver influenzato tale decisione di progettazione), è ancora necessario avere un nome semplice per chiamarle.

1

Buona domanda: la maggior parte dei membri generati dal compilatore (tipi e metodi anonimi) utilizzano nomi che non sono in conflitto con nessun membro della classe. Penso che questa particolare istanza (così come i nomi generati per i metodi degli eventi) sia un caso in cui Microsoft ha fatto un piccolo errore.

L'unica ragione per cui posso giustificare la decisione è che Microsoft potrebbe aver sperato di consentire ad altri linguaggi di chiamare questi metodi che non hanno essi stessi un concetto o sintassi di "proprietà".

+1

non tanto un errore, è stato intenzionale. In effetti, è più facile per le lingue che non supportano la nozione di proprietà per chiamarle, ma rende anche più semplice ottenere il gettor o il settor tramite la reflection. – Abel

2

Perché potrebbe essere necessario chiamare da un codice esterno.

+0

Esterno al CLR ??? – Motti

+1

No, "esterno" a C# - vedere risposta Jb Evains –

7

Il Common Language Specification (CLS) richiede l'utilizzo dei metodi get_ e set_ nell'IL (decorato con bit speciali) quando si implementano le proprietà. Ciò è necessario affinché diversi compilatori (C#, C++ gestito, VB.NET, J #, IronPython, ecc.) Creino bytecode interoperabili.

Così i caratteri di sottolineatura sono caratteri non "legali" nel senso più ampio. Non sono compatibili con CLS e pertanto non dovrebbero essere utilizzati in interfacce non private.

Inoltre, vedere questo articolo su writing CLS-compliant code sul MSDN.