Небезопасный код для изменения длины (путем мутации!) строкового объекта?


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

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

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

Обновить

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

2 6

2 ответа:

Из строк недокументированных

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';
    }
}

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