Каково максимальное количество методов на класс .NET - PullRequest
8 голосов
/ 09 июня 2011

Название спрашивает все это, на самом деле, но все же, для полноты:

Привет, я пишу небольшой инструмент для посткомпиляции на платформе .NET, и, пытаясь оптимизировать его, я столкнулся с вопросом, на который я не могу легко найти ответ из стандартов ECMA для Common Языковая инфраструктура ( CLI ).

Какое максимальное количество методов может иметь один класс? Есть ли предел?

Редактировать

Спасибо Келси за указание на реальный тест. Хотя мне все равно нужно знать, каков фактический предел, для моих реальных реальных целей, Я хотел бы знать, если это 2 ^ 16/2 ^ 32 -или- 2 ^ 31-1, как он указал, похоже, что он явно выше 64К методов на класс.

Ответы [ 3 ]

6 голосов
/ 09 июня 2011

Интересный вопрос, но не знаю, почему вы когда-нибудь достигнете предела в реальности, поэтому ответ может быть не таким уж полезным, потому что это большое число.

Я нашел этот поток , где кто-то написал следующий тест, чтобы фактически создать класс с возрастающим количеством функций, чтобы увидеть, где находится точка разрыва:

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-битной ссылке на индекс или к чему-то, что я не считаю реалистичным, поскольку вы в любом случае сначала будет достигнут предел ресурса.

Из-за нехватки ресурсов тест прошел более 200 тыс. +, Но не прошел.

Опять интересная, но не такая полезная информация ИМО.

3 голосов
/ 09 июня 2011

Я думаю, вам нужно будет просмотреть неуправляемые интерфейсы в CLR для определения структур метаданных, чтобы найти ограничения на размер этих структур.Этот ответ (и комментарии) уже отмечает, что это ~ 16 миллионов (24-битный индекс) методов на сборку (не тип).

В качестве альтернативы рассмотрите, что методы отражения возвращают массивы, и существует ограничение1 ГБ на объект в текущей среде выполнения .NET, поэтому максимум будет 1024^3/sizeof(MethodIndo).

2 голосов
/ 09 июня 2011

Найдено несколько ссылок, которые могут быть полезны для вас.

Предел для Java составляет 65535

Аналогичный вопрос в SO для .NET

Похожие сообщения

Объект Бога

...