Нужна интерпретация раздела в спецификации C #

11

Я читаю спецификацию C # . Я мог бы использовать уточнение по сегменту:

C # имеет единую систему типов. Все типы C #, включая примитивные типы, такие как int и double, наследуются от одного корневого типа объекта. Таким образом, все типы совместно используют набор общих операций, и значения любого типа могут храниться, транспортироваться и обрабатываться согласованным образом. Кроме того, C # поддерживает как пользовательские ссылочные типы, так и типы значений, что позволяет динамически размещать объекты, а также хранить легковесные структуры.

Что означает «встроенное хранилище легких конструкций» в этом контексте?

ChuckT
источник

Ответы:

11

Ответ Свика хороший, но я подумал, что добавлю несколько дополнительных очков.

Во-первых, абзац имеет недостатки. Типы указателей не наследуются от объекта. Значения, которые во время компиляции известны как типы интерфейса или типы параметров типа, во время выполнения будут либо недействительными ссылками, либо подлинными экземплярами чего-то, что наследуется от объекта, но это всегда выдает мне странное выражение, что эти типы " наследовать от объекта; Наследование - это свойство того, что члены предка являются членами потомка, но вы обычно не думаете о «ToString» как члене IEnumerable. Вы думаете об этом как о члене того , что реализует IEnumerable .

Абзац также имеет недостатки, потому что это единственное место, где «примитивный тип» появляется в спецификации, и он появляется без определения. Поэтому это и ненужно, и сбивает с толку, и его следует удалить.

Я хотел, чтобы этот пункт был исправлен на некоторое время. В следующий раз, когда я увижу Мадса, я напомню ему.

Чтобы ответить на ваш конкретный вопрос: svick, конечно, правильно, но полезно увидеть конкретный пример. Когда ты говоришь:

struct ColorfulInt
{
    int value;
    Color color;
    ...
}

и вы создаете, скажем, массив:

ColorfulInt[] x = new ColorFulInt[100];

Затем хранилище для этих 100 дюймов и 100 цветов помещается в сам массив . Если бы ColorfulInt был вместо этого классом, то массив содержал бы 100 ссылок на ColorfulInt, каждая из которых должна была бы быть выделена индивидуально. Индивидуальное распределение этих сотен элементов гораздо менее эффективно как во времени, так и в пространстве, чем простое выделение хранилища прямо в самом массиве.

Эрик Липперт
источник
Итак, насколько важна абстракция в памяти этих объектов, когда вы готовы манипулировать ими, к ним легче получить доступ, если они находятся в одном непрерывном блоке адресных пространственных стихов, указывающих на то, кто знает, где? Это правильно, или я все еще что-то упускаю?
ChuckT
@ ЧакТ: Верно. Вы не оплачиваете накладные расходы, а также получаете хорошую локальность кэша.
Эрик Липперт
12

Это означает, что типы значений хранятся непосредственно там, где вы их определяете, что делает их более эффективными по сравнению со ссылочными типами.

Что именно это означает? Если у вас есть локальная переменная типа значения, она обычно будет храниться непосредственно в стеке (но есть много исключений). Если у вас есть поле типа значения, оно будет сохранено непосредственно во включающем классе или структуре.

svick
источник
1
Это имеет смысл. Спасибо, что рассказал мне об этом, svick!
ChuckT