76

C#のメソッドが持つことができるパラメーターの最大数を把握しようとしています。C#の公式ドキュメント、MSDN、およびいくつかのCLRリファレンスを含め、どこでも答えを確認しましたが、答えが見つかりません。誰かがこの質問に対する答えを持っていますか?

4

2 に答える 2

78

使い捨てプログラムを使用して、メソッドに渡すことができるパラメーターの最大数を決定するプログラムを作成しました。私の実験の結果に基づいて、私が見つけることができる答えに最も近いものは次のとおりです(これらはすべて私のコンピューターでのみ有効です):

  1. 16383パラメーターを持つメソッドを含む.netアプリケーションは、コンパイル、実行、および呼び出すことができます(!)
  2. 16384以上のパラメータを含む.netアプリケーションをコンパイルできますが、そのようなプログラムを実行すると、明示されていない例外がスローされます。
  3. 50000個のパラメーターを含む.netアプリケーションもコンパイルできますが、そのようなアプリケーションを実行しようとすると、StackOverflowExceptionがスローされます。
  4. 100000以上のパラメーターを含む.netアプリケーションをコンパイルしようとすると、csc.exeでコンパイル時エラーが発生し、結果の式が長すぎるか複雑すぎて処理できないことを示します。

それとは別に、誰かがこの質問に対する決定的な答えを持っていますか?

PS誰かが自分のコンピューターでこの実験を試したい場合は、ダウンロードできる私のテストプログラムから始めることができますhttps://docs.google.com/open?id=0B1Q3uRTkbsXic2cwUFpXanNkSk0

于 2012-09-30T05:25:09.080 に答える
69

これがあなたの理論的な答えです:

メソッド引数をスタックにプッシュするために、コンパイルされたコードには、次のMSILオペコードから選択できます。

ldarg.0

ldarg.1

ldarg.2

ldarg.3

ldarg.S

ldarg

ldarg.0toldarg.3は、最初の4つのメソッド引数をスタックにプッシュするために使用されます(thisインスタンスメソッドの最初の引数を含む)。

ldarg.S8ビットの引数番号を受け取るため、最大256個の引数をスタックにプッシュするために使用できます。

これにより、ほとんどのメソッド引数を処理できる古いldargものが残ります。符号なしの16ビット引数番号を使用するため、有効なMSILに正常にコンパイルできる引数の最大数はです2^16 = 65,536

ただし、他の人が指摘しているように、実際の制限はランタイムの実装の詳細によって異なります。rmiesenの回答に基づくと、現在の.NET実装ではパラメーターの最大数が。に制限されているよう2^14です。

于 2013-06-24T05:59:41.290 に答える