21 votes

Pourquoi Math.Min/Max de C# ne sont-ils pas variadiques ?

Je dois trouver le minimum entre 3 valeurs, et j'ai fini par faire quelque chose comme ça :

Math.Min(Math.Min(val1, val2), val3)

Cela me semble un peu idiot, car d'autres langues utilisent des fonctions variadiques pour cela. Mais je doute fort qu'il s'agisse d'un oubli.

Y a-t-il une raison pour qu'une simple fonction Min/Max ne soit pas variadique ? Y a-t-il des implications en termes de performances ? Existe-t-il une version variadique que je n'ai pas remarquée ?

33voto

CommuSoft Points 6439

S'il s'agit d'une collection (Une sous-classe de IEnumerable<T> ), on pourrait facilement utiliser les fonctions de l System.Linq bibliothèque

int min = new int[] {2,3,4,8}.Min();

En outre, il est facile de mettre en œuvre ces méthodes par soi-même :

public static class Maths {

    public static T Min<T> (params T[] vals) {
        return vals.Min();
    }
    public static T Max<T> (params T[] vals) {
        return vals.Max();
    }

}

Vous pouvez appeler ces méthodes avec de simples scalaires, comme suit Maths.Min(14,25,13,2) donnerait 2 .

Ce sont les méthodes génériques, il n'est donc pas nécessaire d'implémenter cette méthode pour chaque type de nombre ( int , float ,...)

Je pense que la raison fondamentale pour laquelle ces méthodes ne sont pas implémentées en général est que, à chaque fois que vous appelez cette méthode, un tableau (ou au moins un IList ) doit être créé. En gardant des méthodes de bas niveau, on peut éviter l'overhead. Cependant, je suis d'accord pour dire que l'on pourrait ajouter ces méthodes à l'objet Math pour faciliter la vie de certains programmeurs.

9voto

JeremyDWill Points 2181

CommuSoft a expliqué comment réaliser l'équivalent en C#, je ne reviendrai donc pas sur cette partie.

Pour répondre spécifiquement à votre question "Pourquoi Math.Min/Max de C# ne sont-ils pas variadiques ?", deux idées me viennent à l'esprit.

Tout d'abord, Math.Min (et Math.Max) n'est pas, en fait, une fonctionnalité du langage C#, mais une fonctionnalité de la bibliothèque du cadre .NET. Cela peut sembler pédant, mais il s'agit d'une distinction importante. En fait, le langage C# ne fournit pas tout Caractéristique linguistique spéciale permettant de déterminer la valeur minimale ou maximale entre deux (ou plusieurs) valeurs potentielles.

Deuxièmement, comme Eric Lippert l'a souligné à plusieurs reprises, les fonctionnalités du langage (et vraisemblablement les fonctionnalités du framework) ne sont pas "supprimées" ou activement exclues - toutes les fonctionnalités sont non implémentées jusqu'à ce que quelqu'un conçoive, implémente, teste, documente et expédie la fonctionnalité. Voir ici pour un exemple .

N'étant pas un développeur .NET framework, je ne peux pas parler du processus de décision réel qui a eu lieu, mais il semble que ce soit un cas classique d'une fonctionnalité qui n'a tout simplement jamais atteint le niveau d'inclusion, similaire à la séquence foreach "fonctionnalité" dont Eric parle dans le lien fourni.

2voto

pickypg Points 8948

Je pense que CommuSoft fournit une réponse solide qui est au moins adaptée aux personnes qui recherchent quelque chose de ce genre, et cela devrait être accepté.

Ceci étant dit, la raison est certainement d'éviter les frais généraux nécessaires pour le moins Le cas d'utilisation probable est que les gens veulent comparer un groupe plutôt que deux valeurs.

Comme l'a souligné @arx, l'utilisation d'un paramétrique serait une surcharge inutile pour le cas le plus utilisé, mais ce serait aussi beaucoup de surcharge inutile en ce qui concerne la boucle qui devrait être utilisée en interne pour parcourir le tableau n - 1 fois.

Je peux facilement voir un argument pour avoir créé la méthode en plus de la forme de base, mais avec LINQ, ce n'est plus nécessaire.

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