web-dev-qa-db-ja.com

C#メソッドがとると定義できるパラメーターの最大数は?

C#のメソッドが持つことができるパラメーターの最大数を把握しようとしています。 C#の公式ドキュメント、MSDN、およびいくつかのCLR参照を含め、どこでも回答を確認しましたが、回答が見つかりません。この質問への回答はありますか?

62
rmiesen

理論的な答えは次のとおりです。

メソッドの引数をスタックにプッシュするために、コンパイルされたコードには次の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

53
Mike Marynowski

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

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

それ以外に、この質問に対する決定的な答えは誰にもありますか?

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

64
rmiesen