我试图找出C#中方法的最大参数数量。我已经到处检查了答案,包括C#官方文档,MSDN和一些CLR参考,我找不到答案。有没有人对这个问题有答案?
答案 0 :(得分:62)
我使用一次性程序创建一个程序来确定我可以传递给方法的最大参数数量。根据我的实验结果,我能找到的答案最接近(所有这些仅在我的计算机上有效):
除此之外,有没有人对这个问题有明确的答案?
P.S。如果有人想在他们的计算机上尝试这个实验,你可以从我的测试程序开始,可以下载https://docs.google.com/open?id=0B1Q3uRTkbsXic2cwUFpXanNkSk0
答案 1 :(得分:51)
这是你的理论答案:
为了将方法参数压入堆栈,已编译的代码具有以下MSIL操作码可供选择:
ldarg.0
ldarg.1
ldarg.2
ldarg.3
ldarg.S
ldarg
ldarg.0
到ldarg.3
用于将前4个方法参数压入堆栈(包括this
作为实例方法的第一个参数)。
ldarg.S
采用8位参数编号,因此可用于将最多256个参数压入堆栈。
这给我们留下了普通的旧ldarg
,它可以处理大多数方法参数:它采用无符号的16位参数编号。因此,可以成功编译为有效MSIL的最大数量的参数是2^16 = 65,536
。
然而,正如其他人所指出的那样,在实际尝试执行方法时,根据系统的平台/体系结构,存在各种实际的堆栈大小限制。基于rmiesen的回答,看起来当前的.NET实现将运行时堆栈的最大大小限制为2^14
。