string.Format()参数

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

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

好吧,我从隐藏中出现…我使用以下程序来validation发生了什么,而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限制,但是在那之前很久你就达到了字符串长度限制,我猜…

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

编辑看起来 IL中有一个限制(0xf4240),但显然这并不像它出现的那样; 在我耗尽系统内存之前,我可以让它变得非常大(2 ^ 24)…


更新; 在我看来,边界点是格式字符串…那些{1000001} {1000002}加起来…快速数学运算(如下)显示我们可以使用的最大有用参数数量是206,449,129:

  long remaining = 2147483647;// max theoretical format arg length long count = 10; // ie {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的详细答案。

唯一重要的其他限制是调试器。 将一定数量的参数直接传递给函数后,调试器在该方法中的function就会降低。 我相信限制是64个参数。

注意:这并不意味着具有64个成员的数组,而是直接传递给该函数的64个参数。

你可能会大笑并说“谁会这样做?” 这当然是一个有效的问题。 然而LINQ比你想象的要容易得多。 在LINQ的引擎下,编译器会生成大量代码。 对于大型生成SQL查询,可能会选择超过64个字段,您可能会遇到此问题。 因为引擎盖下的编译器需要将所有字段传递给匿名类型的构造函数。

仍然是一个角落案件。

考虑到Array类和String类的限制都是Int32的上限(此处记录为2,147,483,647: Int32 Structure ),可以合理地认为此值是格式参数的数字字符串的限制。

更新检查reflection器时,John是对的。 String.Format,使用红门reflection器,显示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