我试图弄清楚C#中一个方法可以拥有的最大参数数量。我到处都在寻找答案,包括C#官方文档,MSDN和一些CLR参考,但找不到答案。有人对此问题有答案吗?
Answers:
这是您的理论答案:
为了将方法参数推入堆栈,编译后的代码具有以下MSIL操作码可供选择:
ldarg.0
ldarg.1
ldarg.2
ldarg.3
ldarg.S
ldarg
ldarg.0
toldarg.3
用于将前四个方法参数推入堆栈(包括this
作为实例方法的第一个参数)。
ldarg.S
接受一个8位的参数号,因此可用于将多达256个参数推入堆栈。
这给我们留下了普通的old ldarg
,它可以处理最多的方法参数:它需要一个无符号的16位参数号。因此,可以成功编译为有效MSIL的参数的最大数量为2^16 = 65,536
。
但是,正如其他人指出的那样,实际尝试执行方法时,有各种实际的堆栈大小限制,具体取决于系统的平台/体系结构。根据rmiesen的回答,看起来当前的.NET实现将运行时堆栈的最大大小限制为2^14
。
我使用了一个一次性程序来创建一个程序,以确定可以传递给方法的最大参数数量。根据我的实验结果,最接近答案的是以下内容(所有答案仅在我的计算机上有效):
除此之外,有人对这个问题有明确的答案吗?
PS:如果有人想在自己的计算机上尝试该实验,则可以从我的测试程序开始,该程序可以下载https://docs.google.com/open?id=0B1Q3uRTkbsXic2cwUFpXanNkSk0