Небезопасный код для изменения длины (путем мутации!) Объекта String? - PullRequest
6 голосов
/ 18 ноября 2011

Поскольку .NET не использует стиль C null s для завершения строки, как я могу сохранить выделенную строку, но изменить ее длину с помощью небезопасного кода?

Как я понимаю .NET, использующий 20-байтовый заголовок для каждой строки, предположительно, это где длина строки хранится, есть ли способ напрямую изменить эту длину? Поэтому .NET будет хранить строку в памяти, но когда я вызову .Length, он вернет .Length, который я хочу.

если это возможно, также было бы интересно услышать все безумные возможные побочные эффекты этого

UPDATE

Я пытаюсь сделать это без использования отражения.

Ответы [ 2 ]

4 голосов
/ 18 ноября 2011

От Строки UNOCOCUMENTED

public static unsafe void SetLength(string s, int length)
{
    fixed(char *p = s)
    {
        int *pi = (int *)p;
        if (length<0 || length > pi[-2])
            throw( new ArgumentOutOfRangeException("length") );
        pi[-1] = length;
        p[length] = '\0';
    }
}
0 голосов
/ 18 ноября 2011

Вы можете использовать Reflection для установки поля m_StringLength.

...