Ответ Свика хороший, но я подумал, что добавлю несколько дополнительных очков.
Во-первых, абзац имеет недостатки. Типы указателей не наследуются от объекта. Значения, которые во время компиляции известны как типы интерфейса или типы параметров типа, во время выполнения будут либо недействительными ссылками, либо подлинными экземплярами чего-то, что наследуется от объекта, но это всегда выдает мне странное выражение, что эти типы " наследовать от объекта; Наследование - это свойство того, что члены предка являются членами потомка, но вы обычно не думаете о «ToString» как члене IEnumerable. Вы думаете об этом как о члене того , что реализует IEnumerable .
Абзац также имеет недостатки, потому что это единственное место, где «примитивный тип» появляется в спецификации, и он появляется без определения. Поэтому это и ненужно, и сбивает с толку, и его следует удалить.
Я хотел, чтобы этот пункт был исправлен на некоторое время. В следующий раз, когда я увижу Мадса, я напомню ему.
Чтобы ответить на ваш конкретный вопрос: svick, конечно, правильно, но полезно увидеть конкретный пример. Когда ты говоришь:
struct ColorfulInt
{
int value;
Color color;
...
}
и вы создаете, скажем, массив:
ColorfulInt[] x = new ColorFulInt[100];
Затем хранилище для этих 100 дюймов и 100 цветов помещается в сам массив . Если бы ColorfulInt был вместо этого классом, то массив содержал бы 100 ссылок на ColorfulInt, каждая из которых должна была бы быть выделена индивидуально. Индивидуальное распределение этих сотен элементов гораздо менее эффективно как во времени, так и в пространстве, чем простое выделение хранилища прямо в самом массиве.