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


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

2   51   2012-09-30 09:25:09

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.

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

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

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

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