string.Format()参数

Bla*_*rig 15 c# language-features

你可以传递给string.Format()方法多少个参数?

必须有某种理论或强制限制.它是基于params []类型的限制还是正在使用它或完全不同的应用程序的内存使用情况?

Mar*_*ell 19

据我所知...

好吧,理论上的限制是数组的int32限制,但是你在此之前很久就达到了字符串长度限制,我猜......

只是不要生气它;-p最好将大量小片段写入(例如)文件或响应,而不是一个巨大的打击.

编辑 - 看起来 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);
Run Code Online (Sandbox Code Playgroud)


Joh*_*ren 19

好吧,我从隐藏中出现...我使用以下程序来验证发生了什么,而Marc指出像这样的字符串"{0} {1} {2} ... {2147483647}"将成功在参数列表之前的内存限制为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();
Run Code Online (Sandbox Code Playgroud)

喜欢讨论的人!