2010-08-05 6 views
16

VS2010 MSDN Named and Optional Arguments (C# Programming Guide) nous parle de paramètres facultatifs en C#, montrant le code comme je pense:Valeur par défaut du paramètre OptionalAttribute?

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

Ok, mais il dit aussi:

Vous pouvez également déclarer en option des paramètres à l'aide le .NET classe OptionalAttribute. Les paramètres OptionalAttribute ne requièrent pas de valeur par défaut.

Je lis MSDN's OptionalAttribute page, et fait des recherches en ligne (ce qui montre beaucoup de gens se réclamant des paramètres de OptionalAttribute ne peuvent pas être consommés par C# - Je devine que ces commentaires ont été faites avant C# 4), mais je peux » t trouver la réponse à deux questions:

Si je OptionalAttribute pour définir un paramètre C# en option:

  1. quelle valeur sera utilisée si j'appelle cette méthode et ne précise pas la valeur de ce paramètre?
  2. cette valeur sera-t-elle évaluée au moment de la compilation ou de l'exécution?
+0

Exécutez-le dans le débogage et vérifiez sa valeur. Je suspecterais null. –

+0

Eh bien, je suspecterais 'default (T)' qui est nul ou zéro. –

Répondre

12

Les règles sont ceci:

Notez que dans le cas de tout, sauf les paramètres de type object, c'est l'équivalent de default(T).

J'ai été un peu surpris, car le C# 4.0 specification n'indiquait pas quel serait le résultat, et je m'attendrais à ce qu'il soit là.

Aussi (comme indicated by Scott Rippey in the comments), cela est évalué à la compilation, ce n'est pas une opération d'exécution, ce qui signifie que si vous avez des appels à cette méthode dans d'autres assemblys déjà déployés, et vous changez la valeur optionnelle , la valeur par défaut transmise à la méthode change et non sauf si vous compilez tout ce qui effectue l'appel par rapport à la méthode dans l'assembly.

+1

Vous devriez également mentionner que cela est évalué au moment de la compilation. Le compilateur insère les valeurs par défaut dans le code ** appelant ** lors de la compilation. –

+1

@ScottRippey Terminé. – casperOne

+1

Je pense qu'il est * aussi * intéressant de mentionner que lorsque vous invoquez une méthode par réflexion, vous passez dans 'Type.Missing' et la valeur appropriée sera insérée dans la méthode appelée à * run * time. Donc, cela peut être fait au moment de l'exécution ainsi que la compilation. (Référence: ['Type.Missing'] (http://msdn.microsoft.com/en-us/library/system.type.missing.aspx)) –

Questions connexes