C#方法可以定义为采用的最大参数数量是多少?

时间:2012-09-30 05:25:09

标签: c# .net clr

我试图找出C#中方法的最大参数数量。我已经到处检查了答案,包括C#官方文档,MSDN和一些CLR参考,我找不到答案。有没有人对这个问题有答案?

2 个答案:

答案 0 :(得分:62)

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

  1. 包含具有16383参数的方法的.net应用程序可以编译,运行和调用(!)
  2. 可以编译包含16384或更多参数的.net应用程序,但运行此类程序会引发未声明的异常。
  3. 也可以编译包含50000个参数的.net应用程序,但尝试运行此类应用程序会导致抛出StackOverflowException。
  4. 尝试编译包含100000个或更多参数的.net应用程序会导致csc.exe发出编译时错误,指出结果表达式太长或太复杂而无法处理。
  5. 除此之外,有没有人对这个问题有明确的答案?

    P.S。如果有人想在他们的计算机上尝试这个实验,你可以从我的测试程序开始,可以下载https://docs.google.com/open?id=0B1Q3uRTkbsXic2cwUFpXanNkSk0

答案 1 :(得分:51)

这是你的理论答案:

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

ldarg.0

ldarg.1

ldarg.2

ldarg.3

ldarg.S

ldarg

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

ldarg.S采用8位参数编号,因此可用于将最多256个参数压入堆栈。

这给我们留下了普通的旧ldarg,它可以处理大多数方法参数:它采用无符号的16位参数编号。因此,可以成功编译为有效MSIL的最大数量的参数是2^16 = 65,536

然而,正如其他人所指出的那样,在实际尝试执行方法时,根据系统的平台/体系结构,存在各种实际的堆栈大小限制。基于rmiesen的回答,看起来当前的.NET实现将运行时堆栈的最大大小限制为2^14