Quel est le nombre maximum de paramètres à une méthode C# peut être définie comme la prise?
Je suis à essayer de comprendre ce que le nombre maximum de paramètres d'une méthode en C# peut avoir. J'ai vérifié partout pour une réponse, y compris le C# documentation officielle, MSDN, et un couple de CLR références et je ne peux pas trouver une réponse. Quelqu'un aurait-il une réponse à cette question?
- Ce serait une bonne question pour @JonSkeet 🙂
- Parce que connaissant les réponses à des questions apparemment banales, comme cela peut vous épargner des heures ou des jours douloureux de débogage de l'enfer...surtout si une auto-généré méthode génère des méthodes avec une très grande paramètre de compte (appelé arité en Informatique jargon).
Vous devez vous connecter pour publier un commentaire.
Voici votre réponse théorique:
Afin de pousser les arguments de méthode sur la pile, le code compilé a la suite de MSIL opcodes de choisir à partir de:
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 compristhis
comme premier argument pour les méthodes d'instance).ldarg.S
prend un 8 bits numéro d'argument, et il peut donc être utilisé pour pousser jusqu'à 256 arguments sur la pile.Qui nous laisse avec un bon vieux
ldarg
, qui permet de traiter la plupart des arguments de méthode: il prend un entier non signé de 16 bits de l'argument nombre. De sorte que le plus grand nombre d'arguments qui peuvent être compilé avec succès en valide MSIL est2^16 = 65,536
.Comme d'autres l'ont noté, toutefois, il existe diverses pratiques de la taille de la pile des limites qui s'appliquent lorsque vous en fait tentez d'exécuter la méthode en fonction de la plate-forme/l'architecture du système. Basé sur rmiesen réponse, il ressemble à l'actuel .NET de la mise en œuvre des limites de la taille maximale de la pile lors de l'exécution de
2^14
.J'ai utilisé un jetable programme pour créer un programme afin de déterminer le nombre maximal de paramètres que je peux passer à une méthode. Sur la base des résultats de mon expérimentation, le plus proche de la réponse que je peux trouver sont les suivants (tous ce qui est valable uniquement sur mon ordinateur):
A côté de cela, quelqu'un a une réponse définitive à cette question?
P. S. Si quelqu'un veut tenter cette expérience sur leur ordinateur, vous pouvez commencer avec mon programme de test, qui peut être téléchargé https://docs.google.com/open?id=0B1Q3uRTkbsXic2cwUFpXanNkSk0