76

我试图弄清楚 C# 中的方法可以拥有的最大参数数。我到处寻找答案,包括 C# 官方文档、MSDN 和一些 CLR 参考资料,但我找不到答案。有人对这个问题有答案吗?

4

2 回答 2

78

我使用一次性程序创建了一个程序来确定我可以传递给方法的最大参数数量。根据我的实验结果,我能找到的最接近答案的是以下(所有这些都只在我的电脑上有效):

  1. 可以编译、运行和调用包含具有 16383 个参数的方法的 .net 应用程序 (!)
  2. 可以编译包含 16384 个或更多参数的 .net 应用程序,但运行此类程序会引发未声明的异常。
  3. 也可以编译包含 50000 个参数的 .net 应用程序,但尝试运行这样的应用程序会导致引发 StackOverflowException。
  4. 尝试编译包含 100000 个或更多参数的 .net 应用程序会导致 csc.exe 给出编译时错误,指出生成的表达式太长或太复杂而无法处理。

除此之外,有人对这个问题有明确的答案吗?

PS 如果有人想在自己的电脑上尝试这个实验,可以从我的测试程序开始,可以下载https://docs.google.com/open?id=0B1Q3uRTkbsXic2cwUFpXanNkSk0

于 2012-09-30T05:25:09.080 回答
69

这是您的理论答案:

为了将方法参数推入堆栈,编译后的代码有以下 MSIL 操作码可供选择:

ldarg.0

ldarg.1

ldarg.2

ldarg.3

ldarg.S

ldarg

ldarg.0toldarg.3用于将前 4 个方法参数压入堆栈(包括this作为实例方法的第一个参数)。

ldarg.S接受一个 8 位参数编号,因此它可用于将多达 256 个参数压入堆栈。

这给我们留下了简单的 old ldarg,它可以处理最多的方法参数:它需要一个无符号的 16 位参数编号,因此可以成功编译为有效 MSIL 的最大参数数量是2^16 = 65,536.

然而,正如其他人所指出的,实际限制将取决于运行时的实现细节。根据 rmiesen 的回答,当前的 .NET 实现似乎将参数的最大数量限制为2^14.

于 2013-06-24T05:59:41.290 回答