15

string.Format() メソッドにいくつのパラメーターを渡すことができますか?

それには、ある種の理論的または強制的な制限が必要です。それは params[] タイプの制限、またはそれを使用しているアプリのメモリ使用量、またはまったく別のものに基づいていますか?

4

4 に答える 4

19

わかりました。隠れていたところから出てきました...何が起こっているのかを確認するために次のプログラムを使用しました。引数リストの前に 2 GiB のメモリ制限があるため、私の調査結果はあなたの調査結果と一致しませんでした。したがって、 string.Format メソッド呼び出しに入れることができるパラメーターの数のハードリミットは 107713904 でなければなりません

int i = 0;
long sum = 0;
while (sum < int.MaxValue)
{
    var s = sizeof(char) * ("{" + i + "}").Length;
    sum += s; // pseudo append
    ++i;
}
Console.WriteLine(i);
Console.ReadLine();

ディスカッションの人々が大好きです!

于 2009-02-18T14:29:41.040 に答える
19

私の知る限りではありません...

まあ、理論上の制限は配列のint32制限ですが、そのずっと前に文字列の長さの制限に達すると思います...

気にしないでください ;-p 1 つの大きなヒットよりも、(たとえば) ファイルや応答に多数の小さな断片を書き込む方がよい場合があります。

編集- IL (0xf4240) に制限があるように見えましたが、明らかにこれは見た目とは異なります。システムメモリが不足する前に、かなり大きくすることができます(2 ^ 24)...


アップデート; 境界点はフォーマット文字列のように思えます... これらの {1000001}{1000002} を合計すると... 簡単な計算 (以下) は、使用できる引数の有効な最大数が 206,449,129 であることを示しています。

    long remaining = 2147483647;// max theoretical format arg length
    long count = 10; // i.e. {0}-{9}
    long len = 1;
    int total = 0;
    while (remaining >= 0) {
        for(int i = 0 ; i < count && remaining >= 0; i++) {
            total++;
            remaining -= len + 2; // allow for {}
        }
        count *= 10;
        len++;
    }

    Console.WriteLine(total - 1);
于 2009-02-18T13:21:53.763 に答える
4

マークの詳細な答えを拡張します。

重要な他の唯一の制限は、デバッガーです。特定の数のパラメーターを関数に直接渡すと、そのメソッドではデバッガーの機能が低下します。制限は64パラメータだと思います。

注:これは、64個のメンバーを持つ配列を意味するのではなく、64個のパラメーターが関数に直接渡されることを意味します。

あなたは笑って「誰がこれをするだろうか」と言うかもしれません。これは確かに有効な質問です。それでも、LINQを使用すると、これは思ったよりもはるかに簡単になります。LINQの内部では、コンパイラは多くのコードを生成します。64を超えるフィールドが選択されている大規模なSQL生成クエリの場合、この問題が発生する可能性があります。内部のコンパイラは、すべてのフィールドを匿名型のコンストラクタに渡す必要があるためです。

それでもコーナーケース。

于 2009-02-18T14:05:34.843 に答える