16
mai
2007
Optional
mai
2007
Sauf erreur de ma part, C# n’autorise pas les arguments optionnels avec des valeurs par défaut. Ludovic m’a montré aujourd’hui que VB si.
Public Function Toto(Optional ByVal t As String = "AZERTY") As String
Return t
End Function
Return t
End Function
Du coup si on fait
Console.WriteLine(Toto())
Console.WriteLine(Toto("QWERTY"))
Console.WriteLine(Toto("QWERTY"))
On a
AZERTY
QWERTY
dans la console.
Maintenant, cela m’amène à me poser une question : pourquoi ce n’est pas possible avec C# ?
Pour info, le compilateur remplace Toto() par Toto(« AZERTY »).
Quand on fait traduire le code en C# par reflector, on obtient le code suivant pour la méthode Toto :
public static string Toto([DefaultParameterValue("AZERTY")] string t)
{
return t;
}
{
return t;
}
Par contre je ne sais pas à quoi il sert l’attribut DefaultParameterValue vu que
Toto(null)
retourne null.
Quelqu’un a-t-il déjà utilisé cet attribut ?
Hum, ce que je sais avec certitude, c’est que certains langages gèrent les paramètres optionnels et pas d’autres (VB vs C# !).
Sans y réfléchir, j’ai donc marqué que l’IL gérait les paramètres par défaut, mais je pense que ce n’est pas vrai et que tu as raison : l’IL ne gère pas les paramètres par défaut, la gestion est en fait cachée, et c’est juste une facilité…
Je regrette que le même mécanisme n’ait pas été mis en place en C# !!
Merci beaucoup pour toutes ces informations.
Bien compris pour le DefaultParameterValue, j’aurais dû y penser !
Par contre ce qui me surprend c’est que si l’IL autorise les paramètres par défaut, pourquoi l’IL généré appelle la méthode Toto en lui passant « AZERTY » en paramètre quand par code je ne lui ai pas passé de paramètre. L’explication que je voyais était que l’IL ne gérait pas les paramètres par défaut et que c’était juste une facilité offerte au développeur, le compilateur VB faisant le travail pour générer de l’IL appelant la valeur par défaut.
Es-tu sûr de toi sur le fait que l’IL gère les paramètres par défaut ?
En fait au niveau IL, .Net autorise les paramètres par défaut.
Par contre tous les langages ne les autorise pas. VB les gère, C# non.
Néanmoins, on peut quand même écrire en C# des fonctions en indiquant que des paramètres sont « optional » et en indiquant la valeur par défaut.
(Normal, vu que ces informations sont stockées dans des attributs, comme le montre un coup d’oeil sur System.Reflection.ParameterInfo)
Pour cela il faut utiliser les attributs « optional » et « DefaultParameterValue ».
Mais ces arguments optionnels ne sont gérés que par certains langages sachant les gérer (tels que VB… pas tel que C#).
Je trouve vraiment dommage que C# ne gère pas les paramètres optionnels, car il y a des cas où c’est franchement pratique…
Je trouve encore plus dommage qu’il y ait des langages qui les gère, et d’autre non !
A noter l’existence de « Type.Missing » qui permet à C# d’avoir une valeur par défaut « propre » lors d’utilisation de composants COM…