La surcharge est-elle le seul moyen d'avoir des arguments de fonction par défaut en C# ?

StackOverflow https://stackoverflow.com/questions/40090

  •  09-06-2019
  •  | 
  •  

Question

Est-il vrai que la seule façon de gérer les arguments de fonction par défaut consiste à surcharger les fonctions ?

Par exemple, en PHP, je peux faire ceci :

function foo($x, $y=0)
{
}

La meilleure façon de le gérer en C# serait-elle la suivante ?

void foo(int x)
{
  foo(x, 0);
}

void foo(int x, int y)
{
}

Exemple tiré d'ici

Modifier

Transformation de l'exemple C# en C# réel (Merci Blair Conrad)

Était-ce utile?

La solution

Oui, ce serait mieux, sauf que vous omettez le $s sur les noms des paramètres, comme d'autres l'ont souligné.Pour ceux qui s'intéressent à la justification de l'absence de valeurs de paramètres par défaut, voir l'explication de @Giovanni Galbo.

Autres conseils

Juste pour satisfaire une certaine curiosité :

Depuis Pourquoi C# ne prend-il pas en charge les paramètres par défaut ?:

Dans des langages tels que C++, une valeur par défaut peut être incluse dans la déclaration de méthode :

void Processus (Employé, bonus booléen = false)

Cette méthode peut être appelée soit avec :

a.Processus (employé, vrai) ;

ou

a.Processus (employé);

dans le second cas, le paramètre bonus est mis à faux.

C# n'a pas cette fonctionnalité.

L'une des raisons pour lesquelles nous n'avons pas cette fonctionnalité est liée à une implémentation spécifique de la fonctionnalité.Dans le monde C++, lorsque l'utilisateur écrit :

a.Processus (employé);

le compilateur génère

a.process(employé, faux);

En d’autres termes, le compilateur prend la valeur par défaut spécifiée dans le prototype de méthode et la met dans l’appel de méthode – c’est comme si l’utilisateur écrivait « false » comme deuxième paramètre.Il n'y a aucun moyen de modifier cette valeur par défaut sans forcer l'utilisateur de la classe à recompiler, ce qui est regrettable.

Le modèle de surcharge fonctionne mieux à cet égard.L'auteur du framework définit simplement deux méthodes distinctes, et celle à paramètre unique appelle la méthode à deux paramètres.Cela conserve la valeur par défaut dans le framework, où elle peut être modifiée si nécessaire.

Il serait possible pour un compilateur de prendre quelque chose comme la définition C++ et de produire les surcharges, mais cette approche pose quelques problèmes.

La première est que la corrélation entre le code écrit par l’utilisateur et le code généré par le compilateur est moins évidente.Nous essayons généralement de limiter la magie lorsque cela est possible, car cela rend la tâche plus difficile pour les programmeurs.Le deuxième problème concerne des éléments tels que les commentaires de documents XML et Intellisense.Le compilateur devrait avoir des règles spéciales sur la façon dont il génère des commentaires de documentation pour les méthodes surchargées, et Intellisense devrait avoir l'intelligence de regrouper les méthodes surchargées en une seule méthode.

Écrire soi-même des surcharges est un peu moins pratique, mais nous pensons que c'est une solution acceptable.

En ce qui concerne la extrait de la FAQ c#:

La plupart des problèmes répertoriés ici ont été résolus pour VB.Net (en particulier les problèmes de commentaires Intellisense et XML), ce qui signifie qu'il s'agit vraiment de fausses pistes... il existe du code disponible pour l'équipe C# qui résoudra le problème.

Une autre raison est liée au fait de forcer un utilisateur d'une classe à recompiler, mais c'est aussi un peu une fausse piste.Si tu changement une valeur par défaut dans votre classe framework et l'utilisateur le fait pas devez recompiler, vous risquez l'utilisateur ne sachant pas que la valeur par défaut a changé. Vous avez maintenant un bug potentiel dans le code qui n’apparaît qu’au moment de l’exécution.En d’autres termes, l’alternative consistant à surcharger la fonction est au moins aussi mauvaise.Bien sûr, cela suppose aussi une implémentation spécifique de la fonctionnalité, mais c'est l'implémentation suggérée dans la FAQ.

Par conséquent, vous devez peser la raison restante ("essayez de limiter la magie") par rapport au fait (qu'ils reconnaissent) que l'écriture des surcharges est "un peu moins pratique".Personnellement, je dis d'intégrer la fonctionnalité et de laisser le programmeur décider de l'utiliser ou non.

Les arguments par défaut font partie du C++, mais depuis C# 3.5, les arguments par défaut ne sont toujours pas pris en charge - vous devrez les surcharger.Ils sont disponibles dans VB.Net depuis la version 1.0.

Oui.

Ou du curry.

Ou faire abstraction dans une classe et y utiliser les valeurs par défaut.

Non, AFAIK C# ne prend pas en charge la substitution, et oui, c'est la manière recommandée pour obtenir le même effet.

Comme indiqué, cela n'est actuellement pas disponible en C#, mais ils seront présents dans C# 4.0, comme l'explique Sam Ng sur son blog :

http://blogs.msdn.com/samng/archive/2009/02/03/named-arguments-optional-arguments-and-default-values.aspx

est-ce que ça ne fait pas l'affaire ?

void foo(int x):this(x, 0){}

void foo(int x, int y){
 // code here
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top