C#方法可以定义的参数的最大数量是多less?
我想弄清楚什么C#中的方法可以有最大数量的参数。 我已经到处检查了一个答案,包括C#官方文档,MSDN和几个CLR引用,我找不到答案。 有没有人有这个问题的答案?
这是你的理论答案:
为了将方法参数推送到堆栈,编译代码有以下MSIL操作码可供select:
ldarg.0
ldarg.1
ldarg.2
ldarg.3
ldarg.S
ldarg
ldarg.0
到ldarg.3
用于将前4个方法参数压入堆栈(包括作为实例方法的第一个参数)。
ldarg.S
需要一个8位的参数号,所以它可以用来将最多256个参数压入堆栈。
这给我们留下了简单的旧的ldarg
,它可以处理最多的方法参数:它需要一个无符号的16位参数号。 所以可以被成功编译成有效的MSIL的参数的最大数量是2^16 = 65,536
。
然而,正如其他人所指出的那样,实际上根据系统的平台/体系结构尝试执行您的方法时,存在各种实际的堆栈大小限制。 根据rmiesen的回答,看起来当前的.NET实现将运行时的最大堆栈大小限制为2^14
。
我使用一次性程序来创build一个程序,以确定我可以传递给一个方法的参数的最大数量。 根据我的实验结果,最接近答案,我可以find以下(所有这些只有在我的电脑上有效):
- 包含具有16383个参数的方法的.net应用程序可以编译,运行和调用(!)
- 包含16384或更多参数的.net应用程序可以被编译,但运行这样的程序会引发一个未声明的exception。
- 包含50000个参数的.net应用程序也可以被编译,但试图运行这样的应用程序会导致抛出StackOverflowException。
- 试图编译包含100000个参数或更多的.net应用程序导致csc.exe给出编译时错误,指出由此产生的expression式太长或复杂,无法处理。
除此之外,有没有人有这个问题的明确答案?
PS如果有人想在他们的电脑上尝试这个实验,可以从我的testing程序开始,可以从https://docs.google.com/open?id=0B1Q3uRTkbsXic2cwUFpXanNkSk0