Каково максимальное количество параметров, которые можно определить методом С# как взятие?

Я пытаюсь выяснить, какое максимальное число параметров может иметь метод на С#. Я проверил всюду для ответа, включая официальную документацию С#, MSDN и пару CLR-ссылок, и я не могу найти ответ. Кто-нибудь имеет ответ на этот вопрос?

Ответ 1

Вот ваш теоретический ответ:

Чтобы вызывать аргументы метода в стек, скомпилированный код имеет следующие коды операций MSIL на выбор:

ldarg.0

ldarg.1

ldarg.2

ldarg.3

ldarg.S

ldarg

ldarg.0 to ldarg.3 используется для ввода первых 4 аргументов метода в стек (включая this в качестве первого аргумента для методов экземпляра).

ldarg.S принимает 8-битный номер аргумента, и поэтому его можно использовать для вывода до 256 аргументов в стек.

Это оставляет нам простой старый ldarg, который может обрабатывать большинство аргументов метода: он принимает число аргументов без знака 16 бит. Таким образом, наибольшее количество аргументов, которые могут быть успешно скомпилированы в действительный MSIL, 2^16 = 65,536.

Однако, как отмечали другие, существуют различные практические ограничения размера стека, которые применяются при попытке выполнить ваш метод в зависимости от платформы/архитектуры системы. Основываясь на ответе rmiesen, похоже, что текущая реализация .NET ограничивает максимальный размер стека во время выполнения до 2^14.

Ответ 2

Я использовал броскую программу для создания программы для определения максимального количества параметров, которые я могу передать методу. Основываясь на результатах моих экспериментов, ближайший к ответу, который я могу найти, следующие (все это действует только на моем компьютере):

  • Приложение .net, содержащее метод с параметрами 16383, может быть скомпилировано, запущено и вызвано (!)
  • Приложение .net, содержащее 16384 или более параметров, может быть скомпилировано, но запуск такой программы вызывает неустановленное исключение.
  • Приложение .net, содержащее параметры 50000, также может быть скомпилировано, но попытка запустить такое приложение приводит к выкидыванию StackOverflowException.
  • Попытка скомпилировать приложение .net, содержащее 100000 параметров или более, приводит к тому, что csc.exe дает ошибку времени компиляции, заявляя, что результирующее выражение слишком длинное или сложное для обработки.

Кроме того, кто-нибудь имеет окончательный ответ на этот вопрос?

P.S. Если кто-то хочет попробовать этот эксперимент на своем компьютере, вы можете начать с моей тестовой программы, которую можно скачать https://docs.google.com/open?id=0B1Q3uRTkbsXic2cwUFpXanNkSk0