代码之家  ›  专栏  ›  技术社区  ›  Blatfrig

string.Format()参数

  •  14
  • Blatfrig  · 技术社区  · 17 年前

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

    一定有某种理论上的或强制的限制。它是基于params[]类型的限制,还是使用它的应用程序的内存使用量,还是完全基于其他因素?

    4 回复  |  直到 17 年前
        1
  •  19
  •   Marc Gravell    17 年前

    理论上的限制是数组的int32限制,但在那之前很久你就已经达到了字符串长度限制,我想。。。

    只是不要为此发疯-p在一个文件或响应中写入大量的小片段(例如)可能比一次巨大的点击要好。

    -它 看 就像在IL(0xf4240)中有一个限制,但显然这并不像它看起来的那样;在系统内存耗尽之前,我可以让它变得相当大(2^24)。。。


    使现代化在我看来,边界点是格式字符串。。。那些{1000001}{1000002}加起来。。。简单的数学计算(如下)表明 有用的 我们可以使用的参数数为206449129:

        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);
    
        2
  •  19
  •   John Leidegren    17 年前

    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();
    

    爱讨论的人!

        3
  •  4
  •   JaredPar    17 年前

    扩展Marc的详细答案。

    唯一重要的其他限制是调试器。一旦您将一定数量的参数直接传递给函数,调试器在该方法中的功能就会减弱。我认为限制是64个参数。

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

    你可能会笑着说“谁会这么做?”这当然是一个正确的问题。然而LINQ让这比你想象的要容易得多。在LINQ中,编译器会生成大量代码。对于选择了64个以上字段的大型generate SQL查询,您可能会遇到此问题。因为后台编译器需要将所有字段传递给匿名类型的构造函数。

    这仍然是一个棘手的问题。

        4
  •  3
  •   Jon Limjap    17 年前

    考虑到数组类和字符串类的限制都是Int32的上限(此处记录在2147483647中: Int32 Structure ),有理由相信该值是格式参数的字符串数限制。

    检查反射器后,约翰是对的。格式,使用红色门反射器,显示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) 代码的一部分足以杀死大部分人。因此,“2147483647=x+8x”留给我们的是x=238609294(理论值)。

    当然远低于这个数字;正如评论中提到的,前面的字符串很可能达到字符串长度限制。

    也许有人应该把它编码成一个机器问题P

    推荐文章