Каково максимальное количество параметров, которые может принимать метод C#?
Я пытаюсь выяснить, какое максимальное количество параметров может иметь метод в C#. Я проверил везде ответ, включая официальную документацию C#, MSDN и пару ссылок на CLR, и я не могу найти ответ. У кого-нибудь есть ответ на этот вопрос?
2 ответов:
вот ваш теоретический ответ:
чтобы поместить аргументы метода в стек, скомпилированный код имеет следующие опкоды MSIL на выбор:
ldarg.0
ldarg.1
ldarg.2
ldarg.3
ldarg.S
ldarg
ldarg.0доldarg.3используется для перемещения первых 4 аргументов метода в стек (включаяthisв качестве первого аргумента, например методы.)
ldarg.Sпринимает 8-битный номер аргумента, и поэтому его можно использовать для ввода до 256 аргументов в стек.это оставляет нас с простым старым
ldarg, который может обрабатывать большинство аргументов метода: он принимает беззнаковый 16-битный номер аргумента. Таким образом, наибольшее количество аргументов, которые могут быть успешно скомпилированы в допустимый MSIL-это2^16 = 65,536.однако, как отмечали другие, существуют различные практические ограничения размера стека, которые применяются, когда фактически пытается выполнить ваш метод в зависимости от платформы/архитектуры системы. Основываясь на ответе rmiesen, похоже, что текущая реализация .NET ограничивает максимальный размер стека во время выполнения до
2^14.
Я использовал одноразовую программу для создания программы для определения максимального количества параметров, которые я могу передать методу. Основываясь на результатах моих экспериментов, наиболее близким к ответу, который я могу найти, являются следующие (все из которых действительны только на моем компьютере):
- приложение .net, содержащее метод с 16383 параметрами, может быть скомпилировано, запущено и вызвано (!)
- может быть скомпилировано приложение .net, содержащее 16384 или более параметров, но выполняющее такие программа выдает неустановленное исключение.
- приложение .net, содержащее 50000 параметров, также может быть скомпилировано, но попытка запустить такое приложение приводит к созданию исключения StackOverflowException.
- попытка скомпилировать приложение .net, содержащее 100000 параметров или более результатов в csc.exe дает ошибку времени компиляции, заявляя, что результирующее выражение слишком длинное или сложное для обработки.
кроме того, у кого есть окончательный ответ на этот вопрос?
P. S. Если кто-то хочет попробовать этот эксперимент на своем компьютере, вы можете начать с моей тестовой программы, которую можно скачать https://docs.google.com/open?id=0B1Q3uRTkbsXic2cwUFpXanNkSk0
Comments