Ответ 1
Введите следующий код:
string s = "123";
string s2 = "234";
string s3 = s + s2;
string s4 = s2 + s3;
Console.WriteLine(s + s2);
Теперь поставьте точку останова на последней строке и откройте окно памяти:
Написание s3
в окне памяти мы можем видеть строки 2 (s3
и s4
), выделенные один за другим с 4 байтами размера в начале.
Также вы можете видеть, что выделена другая память, такая как токен типа strings
и другие данные класса string
.
string
class сам содержит элемент private int m_stringLength;
, который содержит длину string
, это также делает string.Concat()
выполнить супер быстрый (путем выделения всей длины в начале):
int totalLength = str0.Length + str1.Length + str2.Length;
String result = FastAllocateString(totalLength);
FillStringChecked(result, 0, str0);
FillStringChecked(result, str0.Length, str1);
FillStringChecked(result, str0.Length + str1.Length, str2);
Я немного странно понимаю, что реализация IEnumerable<char>.Count()
для string
выполняется с использованием реализации по умолчанию, которая означает повторение элементов по одному в отличие от ICollection<T>
как List<T>
, где IEnumerable<char>.Count()
реализуется посредством используя свойство ICollection<T>.Count
.