Я отчетливо помню, как в первые дни .NET был вызов ToString для StringBuilder, который использовал для предоставления нового строкового объекта (который должен быть возвращен) внутренний буфер символов, используемый StringBuilder.Таким образом, если вы сконструировали огромную строку с использованием StringBuilder, вызов ToString не должен был ее копировать.
При этом StringBuilder должен был предотвратить любые дополнительные изменения в буфере, поскольку теперь он использовалсянеизменяемая строкаВ результате StringBuilder будет переключаться на «копирование при изменении», когда любая попытка изменения сначала создаст новый буфер, скопирует в него содержимое старого буфера и только затем изменит его.
IЯ думаю, что предполагалось, что StringBuilder будет использован для создания строки, затем преобразован в обычную строку и отброшен.Для меня это кажется разумным предположением.
Теперь вот эта вещь.Я не могу найти упоминания об этом в документации.Но я не уверен, что это когда-либо было задокументировано.
Поэтому я посмотрел на реализацию ToString с использованием Reflector (.NET 4.0), и мне кажется, что он на самом деле копирует строку, а не просто разделяетбуфер:
[SecuritySafeCritical]
public override unsafe string ToString()
{
string str = string.FastAllocateString(this.Length);
StringBuilder chunkPrevious = this;
fixed (char* str2 = ((char*) str))
{
char* chPtr = str2;
do
{
if (chunkPrevious.m_ChunkLength > 0)
{
char[] chunkChars = chunkPrevious.m_ChunkChars;
int chunkOffset = chunkPrevious.m_ChunkOffset;
int chunkLength = chunkPrevious.m_ChunkLength;
if ((((ulong) (chunkLength + chunkOffset)) > str.Length) || (chunkLength > chunkChars.Length))
{
throw new ArgumentOutOfRangeException("chunkLength", Environment.GetResourceString("ArgumentOutOfRange_Index"));
}
fixed (char* chRef = chunkChars)
{
string.wstrcpy(chPtr + chunkOffset, chRef, chunkLength);
}
}
chunkPrevious = chunkPrevious.m_ChunkPrevious;
}
while (chunkPrevious != null);
}
return str;
}
Теперь, как я уже упоминал ранее, я отчетливо помню, что читал, что это было в первые дни, если .NET.Я даже нашел упоминание в этой книге .
Мой вопрос: было ли это поведение отброшено?Если так, кто-нибудь знает почему?Это имело смысл для меня ...