81 votes

Paramètres de sortie optionnels

En C# 4, existe-t-il un bon moyen d'avoir un paramètre de sortie facultatif ?

0 votes

Je ne vois pas l'intérêt d'une telle fonctionnalité. Si vous avez déjà écouté les sessions des compilateurs C# sur PDC, vous verrez que chaque changement a une signification.

52 votes

Je ne suis pas d'accord pour dire que cette fonctionnalité n'a aucune valeur. Si une méthode contient une certaine logique EN PLUS de renvoyer des données via les paramètres de sortie, je veux être capable d'appeler cette logique, mais je n'ai pas besoin de la sortie...

3 votes

J'utilise Int32.TryParse() pour voir si la chaîne donnée peut être analysée en un nombre et, si c'est le cas, c'est parfois tout ce qui m'importe. Jitbit a donc raison.

81voto

Cameron Points 32208

Pas vraiment, mais vous pouvez toujours surcharger la méthode avec une autre qui ne prend pas le paramètre de sortie.

4 votes

Une idée de la façon de gérer le paramètre facultatif de manière plus élégante que { string dummy; return Foo(out dummy); } dans la surcharge qui ne prend pas le paramètre de sortie ?

3 votes

@Louis : Non, c'est probablement ce que j'aurais fait !

2 votes

C'est beaucoup de code supplémentaire.

9voto

codekaizen Points 14819

Non.

Pour le rendre "facultatif", en ce sens qu'il n'est pas nécessaire d'attribuer une valeur dans la méthode, vous pouvez utiliser la fonction ref .

11 votes

A ref est un cas d'utilisation très différent. Un paramètre optionnel transmet une valeur spécifique si l'appelant n'en spécifie pas. Avec un paramètre ref, l'appelant spécifie toujours une valeur, qu'il ait l'impression de l'avoir spécifiée ou non. Le site ref pointe toujours vers un emplacement mémoire valide, et un emplacement mémoire valide contient toujours algo . Au mieux, il s'agit juste d'une valeur magique sans le bénéfice d'une spécification par défaut disant "la valeur par défaut est X".

4 votes

Oui, cette réponse n'est pas un jugement de conception, c'est pourquoi j'ai ajouté le qualificatif "dans le sens que".

7voto

John Beyer Points 51

Décorer les paramètres avec OptionalAttribute ne fonctionne pas non plus. Pour étendre l'échantillon précédent, vous obtiendriez quelque chose comme :

private void Func(
    [Optional] out int optional1, 
    [Optional] out string optional2) 
{ /* ... */ }

Notez que ce qui précède sera compilé (peut-être malheureusement). Cependant, en essayant de compiler :

Func(out i);

échouera sauf si une surcharge avec une signature à un paramètre est explicitement fournie.

Faire fonctionner (théoriquement) ce qui précède est un problème important. Lorsqu'une méthode avec un paramètre optionnel omis est appelée, un cadre de pile contenant les valeurs de tous les paramètres est créé, et la ou les valeurs manquantes sont simplement remplies avec les valeurs par défaut spécifiées.

Cependant, un paramètre "out" est une référence, pas une valeur. Si ce paramètre est optionnel et non fourni, quelle variable référencerait-il ? Le compilateur doit toujours faire respecter l'exigence selon laquelle le paramètre "out" doit être rempli avant tout retour normal de la méthode, car le compilateur ne sait pas a priori quels paramètres facultatifs (s'il y en a) sont spécifiés par un appelant. Cela signifie qu'une référence à la variable fictive quelque part doit être passée pour que la méthode ait quelque chose à remplir. La gestion de cet espace variable factice créerait un méchant mal de tête pour le rédacteur du compilateur. Je ne dis pas qu'il serait impossible de travailler sur les détails de ce fonctionnement, mais les implications architecturales sont suffisamment importantes pour que Microsoft ait renoncé à cette fonctionnalité.

2voto

private object[] Func();

Assignez autant de sorties optionnelles que vous voulez dans le tableau d'objets de retour et ensuite utilisez-les ! Mais si vous voulez dire que les sorties optionnelles sont quelque chose comme

private void Func(out int optional1, out string optional2)

et ensuite vous appelez quelque chose comme

Func(out i);

alors la réponse est non, vous ne pouvez pas. De plus, C# et le cadre .NET disposent de nombreuses structures de données très flexibles, telles que List y Array et vous pouvez les utiliser comme paramètre de sortie ou comme type de retour. Il n'est donc pas nécessaire d'implémenter un moyen d'avoir des paramètres de sortie optionnels.

1voto

regisbsb Points 519
public class Dummy<T>
{
    public T Value;
}

Ensuite, utilisez DoSomething(out new Dummy<int>().Value) , donde int peut être de n'importe quel type.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X