Потрібна інтерпретація розділу в специфікації C #


11

Я читаю специфікацію C # . Я можу використовувати пояснення на сегменті:

C # має систему уніфікованого типу. Усі типи C #, включаючи примітивні типи, такі як int та double, успадковують від одного типу об'єкта root. Таким чином, усі типи поділяють набір загальних операцій, і значення будь-якого типу можуть зберігатися, транспортуватися та керуватися ними послідовно. Крім того, C # підтримує як визначені користувачем посилання, так і типи значень, що дозволяє динамічно розподіляти об'єкти, а також вбудовувати зберігання легких структур.

Що означає «поточне зберігання легких конструкцій» у цьому контексті?

Відповіді:


11

Відповідь Свічка хороша, але я думав, що я додам кілька додаткових балів.

По-перше, абзац хибний. Типи вказівників не успадковують об'єкт. Значення, які під час компіляції, як відомо, є типом інтерфейсу або типом параметрів типу, під час виконання будуть або недійсними посиланнями, або сумлінними екземплярами чогось, що успадковується від об'єкта, але воно завжди структурувало мене як не дивно, що ці типи " успадковувати "від об'єкта; успадкування - це властивість членів предка членами нащадка, але ви зазвичай не вважаєте "ToString" членом IEnumerable. Ви вважаєте це членом того, що реалізує IEnumerable .

Абзац також є помилковим, оскільки це єдине місце, де "примітивний тип" з'являється у специфікації, і він з'являється без визначення. Тому вона є і непотрібною, і заплутаною, і її слід усунути.

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

Для вирішення вашого конкретного питання: svick звичайно правильний, але корисно переглянути конкретний приклад. Коли ви говорите:

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

і ви створюєте, скажімо, масив:

ColorfulInt[] x = new ColorFulInt[100];

Тоді сховище для цих 100 дюймів та 100 кольорів переходить у сам масив . Якби ColorfulInt був замість класу, то масив містив би 100 посилань на ColorfulInt, кожен з яких повинен був би бути розподілений індивідуально. Індивідуальне виділення цих сотень елементів набагато менш ефективно і в часі, і в просторі, ніж просто розподілення права зберігання в самому масиві.


Отже, чи важливе значення має абстракція пам’яті цих об’єктів, коли, коли ви готові маніпулювати ними, до них простіше отримати доступ, якщо вони знаходяться в одному суміжному блоці адресних просторових віршів, на кого невідомо куди? Це правильно, чи я все-таки щось пропускаю?
ЧакT

@ChuckT: Правильно. Ви не платите накладні витрати непрямості, і ви також отримуєте приємну локацію кешу.
Ерік Ліпперт

12

Це означає, що типи значень зберігаються безпосередньо там, де ви їх визначаєте, що робить їх більш ефективними в порівнянні з еталонними типами.

Що саме це означає? Якщо у вас є локальна змінна типу значення, вона зазвичай зберігається безпосередньо в стеку (але винятків багато). Якщо у вас є поле типу значення, воно буде зберігатися безпосередньо в класі або структурі, що додається.


1
Що має сенс. Дякую за те, що розіграли мене, свиняк!
ChuckT
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.