Dot-Net

每個 .NET 類的最大方法數是多少

  • June 9, 2011

標題實際上詢問了所有內容,但為了完整起見:

嗨,我正在 .NET 平台上編寫一個小型後編譯工具,在嘗試對其進行優化時,我遇到了一個問題,我無法從通用語言基礎架構的 ECMA 標準中輕鬆找到答案(命令行)。

單個類可以擁有的最大方法數是多少?有限制嗎?

編輯

感謝 Kelsey 指出現實生活中的測試。儘管我仍然會關心實際限制是什麼,但出於我實際的現實生活目的,我想知道它是 2^16 / 2^32 -or- 2^31-1,正如他所指出的那樣,它似乎明顯高於每類 64K 方法..

有趣的問題,但不知道為什麼你會在現實中達到極限,所以答案可能不是那麼有用,因為它是一個很高的數字。

我發現這個執行緒,有人編寫了以下測試來實際創建一個具有越來越多函式的類,以查看斷點在哪裡:

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。

引用自:https://stackoverflow.com/questions/6295353