标题实际上问了这一切,但仍然是为了完整性:
嗨,我正在.NET平台上编写一个小的后编译工具,在尝试优化它时,我遇到了一个问题,我不能轻易找到ECMA标准的答案语言基础设施(CLI)。
单个班级可以拥有的最大方法数量是多少?有限制吗?
修改:
感谢Kelsey指出真实的测试。 虽然我仍然关心实际限制是什么,但对于我的实际目的, 我想知道它是否是2 ^ 16/2 ^ 32 - 或 - 2 ^ 31-1,正如他所指出的,它似乎明显高于每类64K方法..
答案 0 :(得分:6)
有趣的问题,但不知道为什么你会在现实中达到极限,所以答案可能没那么有用,因为它是一个很高的数字。
我找到了这个thread,其中有人编写了以下测试来实际创建一个具有越来越多功能的类来查看断点的位置:
namespace MethodCountLimitFinder
{
class Program
{
[System.STAThreadAttribute]
static void Main ( string [] args )
{
Microsoft.CSharp.CSharpCodeProvider provider =
new Microsoft.CSharp.CSharpCodeProvider() ;
System.CodeDom.Compiler.CompilerParameters cp =
new System.CodeDom.Compiler.CompilerParameters() ;
cp.GenerateExecutable = false ;
cp.GenerateInMemory = true ;
System.CodeDom.Compiler.CompilerResults cr = null ;
System.Text.StringBuilder inner =
new System.Text.StringBuilder ( "namespace Tester { class Test {" ) ;
int methodCount = 1000000 ;
while ( true )
{
System.Console.WriteLine ( methodCount ) ;
for ( int i = methodCount ; i > 0 ; i-- )
{
inner.AppendFormat ( "void M{0}(){{}}\n" , methodCount++ ) ;
}
inner.Append ( "}}" ) ;
cr = provider.CompileAssemblyFromSource ( cp , inner.ToString() ) ;
if ( cr.Errors.Count > 0 )
{
break;
}
inner.Remove ( inner.Length - 2 , 2 ) ;
}
foreach ( System.CodeDom.Compiler.CompilerError ce in cr.Errors )
{
System.Console.WriteLine ( ce.ToString() ) ;
}
}
}
}
根据结果看起来它看起来像资源依赖,而不是很可能没有硬定义的规范,除非你将它绑定到32/64位索引引用或者我认为不现实的东西无论如何都会首先达到资源限制。
由于缺乏资源,测试在失败之前超过了200k +。
再次,有趣但并非所有有用的信息IMO。
答案 1 :(得分:3)
我认为您需要查看CLR中的非托管接口以获取元数据结构的定义,以找到对这些结构大小的限制。这个answer(和注释)已经注意到每个程序集(不是类型)大约有1600万(24位索引)方法。
或者考虑反射方法返回数组,当前.NET运行时每个对象的限制为1GB,因此最大值为1024^3/sizeof(MethodIndo)
。
答案 2 :(得分:2)