2009-07-13 24 views
8

Ho già letto l'articolo MSDN a riguardo. Sembra che internamente sia il modo in cui C# imposta quale funzione funzionerà come indicizzatore (ho ragione?). Ora, ho visto il seguente esempio:DefaultMemberAttribute - che cosa fa?

[DefaultMemberAttribute("Main")] 
public class Program { 

    public static void Main() { 
     ... 
    } 
} 

Ora, io non capisco che cosa significa.


Grazie a tutti. Ma non riesco ancora a ottenere la sua utilità, a parte la cosa dell'indicizzatore. Quando chiameremo InvokeMember?

+0

http://stackoverflow.com/a/294405/21239 –

risposta

5

Personalmente non l'ho mai usato, ma per quanto posso dire si sta definendo il metodo predefinito da richiamare quando si chiama InvokeMember. Quindi, utilizzando il codice frammento che hai fornito se ero a dire:

Program prog = new Program(); 
typeof(Program).InvokeMember("", null, null, prog, null); 

perché ho lasciato il primo argomento vuota della InvokeMember chiamarlo sarebbe utilizzare l'attributo per determinare che cosa il membro predefinito è della classe, nella vostra caso è Main.

1

L'attributo DefaultMemberAttribute definisce il membro predefinito da chiamare su quando InvokeMember viene chiamato con una stringa vuota come primo argomento.

Se leggete la documentazione MSDN per InvokeMember, si dice esplicitamente:

Parametri
nome
Tipo: System.String
della stringa contenente il nome del costruttore, il metodo, la proprietà o membro del campo da richiamare.
-or-
Una stringa vuota ("") per richiamare il membro predefinito.

Il membro predefinito sarà quello dichiarato dall'attributo DefaultMemberAttribute.

9

No, lo DefaultMemberAttribute viene utilizzato da lingue come VB.NET per individuare il membro su cui è attivato per impostazione predefinita se nessun membro fa riferimento a un oggetto, ad esempio il membro invocato da InvokeMember. Questo è spesso usato in congiunzione con gli indicizzatori, come hai notato, ma non è usato direttamente da C# (a meno che non si usi esplicitamente InvokeMember).

Tuttavia, per il beneficio di altri linguaggi .NET, C# non emettono il DefaultMemberAttribute per l'indicizzatore di una classe (se ne ha uno), come indicato dalla MSDN:

Il # compilatore C emette la DefaultMemberAttribute su qualsiasi tipo contenente un indicizzatore. In C# è un errore per attribuire manualmente un tipo con DefaultMemberAttribute se il tipo dichiara anche un indicizzatore.

Penso che MSDN confonda le cose facendo riferimento agli indicizzatori molto nelle osservazioni ma dando un esempio che non usa un indicizzatore. Per chiarire, il membro predefinito può essere qualsiasi cosa, ma C# offre un comportamento speciale per gli indicizzatori emettendo l'attributo per te (se esiste un indicizzatore) con l'eccezione di tutti gli altri casi d'uso.