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