76 votes

Quel est le nombre maximum de paramètres qu'une méthode C# peut prendre ?

J'essaie de déterminer le nombre maximum de paramètres que peut avoir une méthode en C#. J'ai cherché partout une réponse, y compris dans la documentation officielle de C#, dans MSDN et dans quelques références CLR, mais je n'ai pas trouvé de réponse. Quelqu'un a-t-il une réponse à cette question ?

11 votes

Ce serait une bonne question pour @JonSkeet :)

12 votes

Parce que connaître les réponses à des questions apparemment triviales comme celle-ci peut vous épargner des heures ou des jours de débogage pénible... surtout si une méthode générée automatiquement génère des méthodes avec un nombre de paramètres extrêmement élevé (appelé arité dans le jargon informatique).

78voto

rmiesen Points 911

J'ai utilisé un programme jetable pour créer un programme visant à déterminer le nombre maximum de paramètres que je peux passer à une méthode. D'après les résultats de mon expérimentation, ce qui se rapproche le plus d'une réponse que je peux trouver sont les suivants (tout cela n'est valable que sur mon ordinateur) :

  1. Une application .net contenant une méthode avec 16383 paramètres peut être compilée, exécutée, et appelée ( !)
  2. Une application .net contenant 16384 paramètres ou plus peut être compilée, mais l'exécution d'un tel programme génère une exception non déclarée.
  3. Une application .net contenant 50000 paramètres peut également être compilée, mais la tentative d'exécution d'une telle application entraîne la levée d'une StackOverflowException.
  4. Si vous tentez de compiler une application .net contenant 100 000 paramètres ou plus, csc.exe affiche une erreur de compilation, indiquant que l'expression résultante est trop longue ou trop complexe pour être traitée.

En dehors de cela, quelqu'un a-t-il une réponse définitive à cette question ?

P.S. Si quelqu'un veut essayer cette expérience sur son ordinateur, vous pouvez commencer par mon programme de test, qui peut être téléchargé https://docs.google.com/open?id=0B1Q3uRTkbsXic2cwUFpXanNkSk0

18 votes

Ces chiffres dépendent de l'architecture du système d'exploitation et de la mémoire de l'ordinateur.

3 votes

Je pense que la mémoire sera davantage affectée par le nombre de paramètres de valeur passés dans les fonctions ainsi que par le type de paramètre. Supposons que vous envoyiez 16383 chaînes de caractères dans la fonction, chaque chaîne faisant environ 2 Mo, le programme fonctionnera-t-il toujours sans exception sur la machine de test ? J'ai vu le code téléchargé par @rmiesen et il était plein de paramètres int.

0 votes

Il est possible que le nombre maximal de paramètres que vous pouvez passer à une méthode soit limité par la mémoire du système, mais ce ne peut pas être la seule limite. Un System.Int32 a une taille de 4 octets, la mémoire utilisée par tous les arguments passés est de 64k. En passant, j'ai fait quelques calculs et 16383 est un de moins que 2^14. Je me demande si cela est significatif d'une manière ou d'une autre...

69voto

Mike Marynowski Points 892

Voici votre réponse théorique :

Afin de pousser les arguments des méthodes sur la pile, le code compilé peut choisir parmi les opcodes MSIL suivants :

ldarg.0

ldarg.1

ldarg.2

ldarg.3

ldarg.S

ldarg

ldarg.0 à ldarg.3 est utilisé pour pousser les 4 premiers arguments de méthode sur la pile (y compris this comme premier argument pour les méthodes d'instance).

ldarg.S prend un numéro d'argument de 8 bits, et donc il peut être utilisé pour pousser jusqu'à 256 arguments sur la pile.

Ce qui nous laisse avec le bon vieux ldarg qui peut gérer le plus grand nombre d'arguments de méthode : il prend un numéro d'argument non signé de 16 bits, de sorte que le plus grand nombre d'arguments qui peuvent être compilés avec succès dans un MSIL valide est le suivant 2^16 = 65,536 .

Toutefois, comme d'autres l'ont fait remarquer, la limite réelle dépendra des détails de mise en œuvre du runtime. D'après la réponse de rmiesen, il semble que l'implémentation actuelle de .NET limite le nombre maximum de paramètres à 2^14 .

4 votes

CIL stocke également les longueurs des tableaux de paramètres dans des short non signés, de sorte que la longueur ne peut pas être supérieure à 65 535.

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