String.Concat(String,String,String,String)有什么意义

Bac*_*ave 5 c# string

如果你有5个或更多你想要连接的字符串String.Concat(),那么它会使用Concat(String[]).

为什么不直接使用Concat(String[])所有的时间和需要做掉Concat(String, String),Concat(String, String, String)Concat(String, String, String, String).

什么是微软的理由不是Concat(String[])只要你想要连接一个或多个字符串?

Ser*_*kiy 7

根据Concat(String[])这种方式实现的参考源:

public static string Concat(params string[] values)
{       
    int totalLength = 0; // variable to calculate total length
    string[] strArray = new string[values.Length]; // second array
    for (int i = 0; i < values.Length; i++) // first loop
    {
        string str = values[i];            
        totalLength += strArray[i].Length;           
    }

    return ConcatArray(strArray, totalLength);
}

private static string ConcatArray(string[] values, int totalLength)
{
    string dest = FastAllocateString(totalLength);
    int destPos = 0; // variable to calculate current position
    for (int i = 0; i < values.Length; i++) // second loop
    {
        FillStringChecked(dest, destPos, values[i]);
        destPos += values[i].Length;
    }
    return dest;
}
Run Code Online (Sandbox Code Playgroud)

Concat(String, String, String)和类似的方法更加优化.它们避免为参数创建字符串数组,它们避免循环(每个循环都有变量,增量和检查逻辑),它们不使用变量来计算结果字符串中的总字符串长度和当前位置:

public static string Concat(string str0, string str1, string str2)
{
    int length = (str0.Length + str1.Length) + str2.Length;
    string dest = FastAllocateString(length);
    FillStringChecked(dest, 0, str0);
    FillStringChecked(dest, str0.Length, str1);
    FillStringChecked(dest, str0.Length + str1.Length, str2);
    return dest;
}
Run Code Online (Sandbox Code Playgroud)

注意:我跳过参数验证代码(空字符串替换为空字符串)以仅显示差异.

  • 我假设他们尽可能多地查看生产代码,并决定提供最多4个代码覆盖大部分代码(特别是在编译器优化调用之后) - 微软已经在C#中为常见的LOB应用做了很多非常务实的决定.请注意,例如`System.Action`仅上升到.net 3.5中的T4,然后.net 4.0根据实际需要添加了超过T16的重载.我想现在世界上没有太多高效的string.Concat需要过去4,大概是因为人们无论如何都会使用StringBuilders. (4认同)