簡體   English   中英

string.Format()參數

[英]string.Format() parameters

你可以傳遞給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的引擎下,編譯器會生成大量代碼。 對於大型生成SQL查詢,可能會選擇超過64個字段,您可能會遇到此問題。 因為引擎蓋下的編譯器需要將所有字段傳遞給匿名類型的構造函數。

仍然是一個角落案件。

考慮到Array類和String類的限制都是Int32的上限(在此處記錄為2,147,483,647: Int32 Structure ),可以合理地認為該值是格式參數的數字字符串的限制。

更新檢查反射器時,John是對的。 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM