web-dev-qa-db-fra.com

Quel est le nombre maximum de paramètres qu'une méthode C # peut être définie comme prenant?

J'essaie de comprendre quel est le nombre maximum de paramètres qu'une méthode en C # peut avoir. J'ai cherché partout une réponse, y compris la documentation officielle C #, MSDN et quelques références CLR et je ne trouve pas de réponse. Quelqu'un at-il une réponse à cette question?

62
rmiesen

Voici votre réponse théorique:

Afin de pousser des arguments de méthode sur la pile, le code compilé a le choix des 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 nombre d'arguments de 8 bits, et peut donc être utilisé pour pousser jusqu'à 256 arguments sur la pile.

Cela nous laisse avec le vieux ldarg, qui peut gérer le plus d'arguments de méthode: il prend un nombre d'arguments non signé de 16 bits. Ainsi, le plus grand nombre d'arguments pouvant être compilés avec succès en MSIL valide est 2^16 = 65,536.

Comme d'autres l'ont noté, cependant, il existe différentes limites pratiques de taille de pile qui s'appliquent lorsque vous essayez réellement d'exécuter votre méthode en fonction de la plate-forme/architecture du système. D'après la réponse de rmiesen, il semble que l'implémentation .NET actuelle limite la taille maximale de la pile au moment de l'exécution à 2^14.

53
Mike Marynowski

J'ai utilisé un programme jetable pour créer un programme afin de déterminer le nombre maximal de paramètres que je peux transmettre à une méthode. Sur la base des résultats de mon expérimentation, les plus proches d'une réponse que je peux trouver sont les suivants (qui ne sont valables 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 ou plusieurs paramètres peut être compilée, mais l'exécution d'un tel programme lève 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 génère une erreur de compilation, indiquant que l'expression résultante est trop longue ou trop complexe à gérer.

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 avec mon programme de test, qui peut être téléchargé https://docs.google.com/open?id=0B1Q3uRTkbsXic2cwUFpXanNkSk

64
rmiesen