2010-08-05 39 views
16

di MSDN VS2010 Named and Optional Arguments (C# Programming Guide) ci parla di parametri opzionali in C#, che mostra il codice come mi aspetto:Valore predefinito del parametro OptionalAttribute?

public void ExampleMethod(int required, 
    string optionalstr = "default string", 
    int optionalint = 10) 

Ok, ma si dice anche:

È possibile anche dichiarare opzionali parametri utilizzando .NET Classe OptionalAttribute. I parametri OptionalAttribute non richiedono un valore predefinito.

ho letto MSDN's OptionalAttribute page, e le ricerche fatto on-line (che mostra un sacco di persone che chiedono parametri OptionalAttribute non può essere consumato da C# -? Sto cercando di indovinare questi commenti sono stati fatti prima di C# 4), ma posso' t trovare la risposta a due domande:

Se uso OptionalAttribute per definire un C# parametro come optional:

  1. quale valore sarà usato se chiamo quel metodo e non specificare il valore del parametro?
  2. questo valore verrà valutato in fase di compilazione o in fase di esecuzione?
+0

Eseguirlo nel debug e controllare il suo valore. Sospetto nulla. –

+0

Beh, sospetto 'default (T)' che è nullo o zero. –

risposta

12

Le regole sono questo:

Si noti che, nel caso di tutto tranne parametri di tipo object, è l'equivalente di default(T).

Sono rimasto un po 'sorpreso, dato che lo C# 4.0 specification non ha indicato quale sarebbe stato il risultato, e mi sarei aspettato che fosse lì.

Inoltre (come indicated by Scott Rippey in the comments), questo viene valutato in fase di compilazione, non è un'operazione di runtime, ovvero se si hanno chiamate a questo metodo in altri assembly già distribuiti e si modifica il valore facoltativo , il valore predefinito passato al metodo sarà non a meno che non si compili tutto ciò che effettua la chiamata contro il metodo nell'assembly.

+1

Si dovrebbe anche ricordare che questo viene valutato al momento della compilazione. Il compilatore inserisce effettivamente i valori predefiniti nel codice ** calling ** durante la compilazione. –

+1

@ScottRippey Fatto. – casperOne

+1

Penso che sia * anche * utile menzionare che quando si richiama un metodo per riflessione, si passa in "Tipo".Manca' e il valore appropriato verrà inserito nel metodo chiamato in * run * time. Quindi può essere fatto in fase di esecuzione così come il tempo di compilazione. (Riferimento: ['Type.Missing'] (http://msdn.microsoft.com/en-us/library/system.type.missing.aspx)) –

Problemi correlati