C#のメソッドが持つことができるパラメーターの最大数を把握しようとしています。 C#の公式ドキュメント、MSDN、およびいくつかのCLR参照を含め、どこでも回答を確認しましたが、回答が見つかりません。この質問への回答はありますか?
理論的な答えは次のとおりです。
メソッドの引数をスタックにプッシュするために、コンパイルされたコードには次の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
。
スローアウェイプログラムを使用してプログラムを作成し、メソッドに渡すことができるパラメーターの最大数を決定しました。私の実験の結果に基づいて、私が見つけることができる答えに最も近いものは次のとおりです(すべては私のコンピューターでのみ有効です):
それ以外に、この質問に対する決定的な答えは誰にもありますか?
追伸誰かが自分のコンピューターでこの実験を試してみたい場合は、ダウンロードできる私のテストプログラムから始めることができます https://docs.google.com/open?id=0B1Q3uRTkbsXic2cwUFpXanNkSk