String.Format StringBuilder
dahili olarak kullanır ... bu yüzden mantıksal olarak, daha fazla yük nedeniyle biraz daha az performans göstereceği fikrine yol açar. Bununla birlikte, basit bir dize birleştirmesi, bir dizeyi diğer ikisi arasına önemli bir derecede enjekte etmenin en hızlı yöntemidir. Bu kanıt, yıllar önce ilk Performans Testinde Rico Mariani tarafından kanıtlanmıştır. Basit gerçek şu ki, birleştirme ... dize parçalarının sayısı biliniyorsa (sınırlama olmadan ... bin parçayı birleştirebilirsiniz ... her zaman 1000 parçasını bildiğiniz sürece) ... her zaman daha hızlı StringBuilder
veya Dize'dir. Biçim. Tek bir bellek tahsisi ve bir dizi bellek kopyasıyla gerçekleştirilebilirler. İşte kanıt
Ve sonuçta, FillStringChecked'i hafızayı kopyalamak için işaretçiler kullanan (Reflector ile çıkarılır) kullanan bazı String.Concat yöntemleri için gerçek kod:
public static string Concat(params string[] values)
{
int totalLength = 0;
if (values == null)
{
throw new ArgumentNullException("values");
}
string[] strArray = new string[values.Length];
for (int i = 0; i < values.Length; i++)
{
string str = values[i];
strArray[i] = (str == null) ? Empty : str;
totalLength += strArray[i].Length;
if (totalLength < 0)
{
throw new OutOfMemoryException();
}
}
return ConcatArray(strArray, totalLength);
}
public static string Concat(string str0, string str1, string str2, string str3)
{
if (((str0 == null) && (str1 == null)) && ((str2 == null) && (str3 == null)))
{
return Empty;
}
if (str0 == null)
{
str0 = Empty;
}
if (str1 == null)
{
str1 = Empty;
}
if (str2 == null)
{
str2 = Empty;
}
if (str3 == null)
{
str3 = Empty;
}
int length = ((str0.Length + str1.Length) + str2.Length) + str3.Length;
string dest = FastAllocateString(length);
FillStringChecked(dest, 0, str0);
FillStringChecked(dest, str0.Length, str1);
FillStringChecked(dest, str0.Length + str1.Length, str2);
FillStringChecked(dest, (str0.Length + str1.Length) + str2.Length, str3);
return dest;
}
private static string ConcatArray(string[] values, int totalLength)
{
string dest = FastAllocateString(totalLength);
int destPos = 0;
for (int i = 0; i < values.Length; i++)
{
FillStringChecked(dest, destPos, values[i]);
destPos += values[i].Length;
}
return dest;
}
private static unsafe void FillStringChecked(string dest, int destPos, string src)
{
int length = src.Length;
if (length > (dest.Length - destPos))
{
throw new IndexOutOfRangeException();
}
fixed (char* chRef = &dest.m_firstChar)
{
fixed (char* chRef2 = &src.m_firstChar)
{
wstrcpy(chRef + destPos, chRef2, length);
}
}
}
E sonra:
string what = "cat";
string inthehat = "The " + what + " in the hat!";
Zevk almak!