C#のメソッドが持つことができるパラメーターの最大数を把握しようとしています。C#の公式ドキュメント、MSDN、およびいくつかのCLRリファレンスを含め、どこでも答えを確認しましたが、答えが見つかりません。誰かがこの質問に対する答えを持っていますか?
2 に答える
使い捨てプログラムを使用して、メソッドに渡すことができるパラメーターの最大数を決定するプログラムを作成しました。私の実験の結果に基づいて、私が見つけることができる答えに最も近いものは次のとおりです(これらはすべて私のコンピューターでのみ有効です):
- 16383パラメーターを持つメソッドを含む.netアプリケーションは、コンパイル、実行、および呼び出すことができます(!)
- 16384以上のパラメータを含む.netアプリケーションをコンパイルできますが、そのようなプログラムを実行すると、明示されていない例外がスローされます。
- 50000個のパラメーターを含む.netアプリケーションもコンパイルできますが、そのようなアプリケーションを実行しようとすると、StackOverflowExceptionがスローされます。
- 100000以上のパラメーターを含む.netアプリケーションをコンパイルしようとすると、csc.exeでコンパイル時エラーが発生し、結果の式が長すぎるか複雑すぎて処理できないことを示します。
それとは別に、誰かがこの質問に対する決定的な答えを持っていますか?
PS誰かが自分のコンピューターでこの実験を試したい場合は、ダウンロードできる私のテストプログラムから始めることができますhttps://docs.google.com/open?id=0B1Q3uRTkbsXic2cwUFpXanNkSk0
これがあなたの理論的な答えです:
メソッド引数をスタックにプッシュするために、コンパイルされたコードには、次のMSILオペコードから選択できます。
ldarg.0
ldarg.1
ldarg.2
ldarg.3
ldarg.S
ldarg
ldarg.0
toldarg.3
は、最初の4つのメソッド引数をスタックにプッシュするために使用されます(this
インスタンスメソッドの最初の引数を含む)。
ldarg.S
8ビットの引数番号を受け取るため、最大256個の引数をスタックにプッシュするために使用できます。
これにより、ほとんどのメソッド引数を処理できる古いldarg
ものが残ります。符号なしの16ビット引数番号を使用するため、有効なMSILに正常にコンパイルできる引数の最大数はです2^16 = 65,536
。
ただし、他の人が指摘しているように、実際の制限はランタイムの実装の詳細によって異なります。rmiesenの回答に基づくと、現在の.NET実装ではパラメーターの最大数が。に制限されているよう2^14
です。