Короткий ответ
Строка имеет , чтобы иметь элемент ссылочного типа (например, char[]
), чтобы иметь переменный размер. Таким образом, любой тип struct String
действительно будет просто ссылочным типом, замаскированным под тип значения в любом случае.
Средний ответ
Я обсуждал это более подробно здесь . Но основной смысл моей идеи был: да, вы могли бы иметь строку «тип значения», предположительно что-то вроде этого:
public struct String
{
char[] m_characters;
public String(IEnumerable<char> characters)
{
m_characters = characters.ToArray();
}
public char this[int index]
{
get { return m_characters[index]; }
}
// All those other string functions... IndexOf, Substring, etc.
}
... но в действительности нет никакого смысла. Вышесказанное - это просто ссылочный тип (обертка вокруг char[]
), расположенный внутри оболочки, которая обманчиво выглядит как тип значения. Более того, когда вы разрабатываете тип таким способом, вы получаете недостатки использования типа значения (например, возможности для упаковки) без каких-либо преимуществ (экземпляр вышеупомянутого типа String
имеет те же требования к выделению памяти, что и эталонный наберите его обертки, поэтому он также ничего не покупает с точки зрения GC).