您可以将多少个参数传递给 string.Format() 方法?
它必须有某种理论上的或强制的限制。它是基于 params[] 类型的限制还是使用它的应用程序的内存使用量,还是完全基于其他东西?
您可以将多少个参数传递给 string.Format() 方法?
它必须有某种理论上的或强制的限制。它是基于 params[] 类型的限制还是使用它的应用程序的内存使用量,还是完全基于其他东西?
据我所知没有...
好吧,理论上的限制是数组的 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);
好的,我从隐藏中出现...我使用以下程序来验证发生了什么,而 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();
喜欢讨论的人!
扩展 Marc 的详细答案。
唯一重要的其他限制是调试器。一旦将一定数量的参数直接传递给函数,调试器在该方法中的功能就会降低。我相信限制是 64 个参数。
注意:这并不是说一个有 64 个成员的数组,而是直接传递给函数的 64 个参数。
你可能会笑着说“谁会这样做?” 这当然是一个有效的问题。然而 LINQ 使这比您想象的要容易得多。在 LINQ 的底层,编译器会生成大量代码。对于选择了超过 64 个字段的大型生成 SQL 查询,您可能会遇到此问题。因为引擎盖下的编译器需要将所有字段传递给匿名类型的构造函数。
仍然是一个角落案例。
考虑到 Array 类和 String 类的限制都是 Int32 的上限(此处记录为 2,147,483,647:Int32 Structure),因此可以合理地认为该值是格式参数的数字字符串的限制。
更新检查反射器后,约翰是对的。使用 Red Gate Reflector 的 String.Format 显示 ff:
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