您可以向string.Format()方法传递多少参数?
在这方面应该有一些理论或强制限制。它是基于params[]类型的限制还是使用它的应用程序的内存使用情况,或者完全是其他因素?
您可以向string.Format()方法传递多少参数?
在这方面应该有一些理论或强制限制。它是基于params[]类型的限制还是使用它的应用程序的内存使用情况,或者完全是其他因素?
好的,我出来了......我使用了以下程序来验证发生了什么,尽管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();
喜欢这里的讨论!
据我所知,没有这个限制...
理论上,数组的极限是int32的极限,但在此之前您会先遇到字符串长度的限制,我想...
只要不过分就可以了;最好将许多小片段写入文件或响应中,而不是一次性写入一个巨大的数据块。
编辑 - 看起来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);
public static string Format(IFormatProvider provider, string format, params object[] args)
{
if ((format == null) || (args == null))
{
throw new ArgumentNullException((format == null) ? "format" : "args");
}
StringBuilder builder = new StringBuilder(format.Length + (args.Length * 8));
builder.AppendFormat(provider, format, args);
return builder.ToString();
}
代码中的format.Length + (args.Length * 8)
部分足以消耗大部分数字。因此,“2,147,483,647 = x + 8x”留下了x = 238,609,294(理论值)。
当然,实际上远远不到这个数值;正如评论中的人们所提到的,字符串达到字符串长度限制的可能性非常高。
也许有人应该把这个问题编程机器问题!:P