valid - ¿Cuál es la cantidad máxima de parámetros que un método de C#se puede definir como tomar?
typeparam c# (2)
Estoy tratando de averiguar cuál es la cantidad máxima de parámetros que puede tener un método en C #. Revisé la respuesta en todas partes, incluida la documentación oficial de C #, MSDN y un par de referencias de CLR y no puedo encontrar una respuesta. ¿Alguien tiene una respuesta a esta pregunta?
Aquí está su respuesta teórica:
Para insertar los argumentos de método en la pila, el código compilado tiene los siguientes códigos de operación MSIL para elegir:
ldarg.0
ldarg.1
ldarg.2
ldarg.3
ldarg.S
ldarg
ldarg.0
a ldarg.3
se usa para insertar los primeros 4 argumentos de método en la pila (incluido this
como primer argumento para los métodos de instancia).
ldarg.S
toma un número de argumento de 8 bits, por lo que se puede usar para insertar hasta 256 argumentos en la pila.
Eso nos deja con ldarg
antiguo ldarg
, que puede manejar la mayoría de los argumentos de método: toma un número de argumento de 16 bits sin signo. Por lo tanto, la mayor cantidad de argumentos que se pueden compilar satisfactoriamente en MSIL válido es 2^16 = 65,536
.
Sin embargo, como han notado otros, existen varios límites prácticos de tamaño de pila que se aplican cuando realmente se intenta ejecutar su método dependiendo de la plataforma / arquitectura del sistema. Según la respuesta de rmiesen, parece que la implementación .NET actual limita el tamaño máximo de la pila en tiempo de ejecución a 2^14
.
Utilicé un programa desechable para crear un programa para determinar la cantidad máxima de parámetros que puedo pasar a un método. Según los resultados de mi experimentación, lo más cercano a una respuesta que puedo encontrar es la siguiente (todas las cuales solo son válidas en mi computadora):
- Una aplicación .net que contiene un método con 16383 parámetros se puede compilar, ejecutar y llamar (!)
- Se puede compilar una aplicación .net que contenga 16384 o más parámetros, pero ejecutar dicho programa arroja una excepción no declarada.
- También se puede compilar una aplicación .Net que contenga 50000 parámetros, pero al intentar ejecutar dicha aplicación, se genera una Exception.
- Intentar compilar una aplicación .net que contenga 100000 parámetros o más resultados en csc.exe dando un error en tiempo de compilación, indicando que la expresión resultante es demasiado larga o compleja de manejar.
Aparte de eso, ¿alguien tiene una respuesta definitiva a esta pregunta?
PD: si alguien quiere probar este experimento en su computadora, puede comenzar con mi programa de prueba, que se puede descargar https://docs.google.com/open?id=0B1Q3uRTkbsXic2cwUFpXanNkSk0