Я пытаюсь выяснить, какое максимальное число параметров может иметь метод на С#. Я проверил всюду для ответа, включая официальную документацию С#, 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