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?
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
.
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):
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