如果你有5个或更多字符串,你想与String.Concat()
连接,那么它会使用Concat(String[])
。
为什么不一直只使用Concat(String[])
并且不再需要Concat(String, String)
,Concat(String, String, String)
和Concat(String, String, String, String)
。
当您想要连接一个或多个字符串时,Microsoft不仅仅使用Concat(String[])
的原因是什么?
答案 0 :(得分: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;
}
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;
}
注意:我跳过参数验证代码(空字符串替换为空字符串)以仅显示差异。
答案 1 :(得分:0)
这是出于性能原因而完成的。您实际上可以使用5个字符串参数调用Concat,但是如果查看生成的代码,它将运行接受该数组的方法。同时添加字符串比串行添加字符串要快。请查看以下链接以获取更多信息。