Відмінність типів відліку та типів значень в основному є компромісом продуктивності мови. Довідкові типи мають певні накладні витрати на будівництво та знищення та вивезення сміття, оскільки вони створюються на купі. Типи значень, з іншого боку, мають накладні витрати на виклики методів (якщо розмір даних більший за покажчик), оскільки весь об'єкт скопійований, а не лише вказівник. Оскільки рядки можуть бути (і зазвичай є) набагато більшими за розмір вказівника, вони розроблені як еталонні типи. Крім того, як Серві вказував, розмір типу значення повинен бути відомий під час компіляції, що не завжди стосується рядків.
Питання про незмінність - окреме питання. Як типи посилань, так і типи значень можуть бути або змінними, або незмінними. Типи значень, як правило, незмінні, оскільки семантика типів змінних значень може бути заплутаною.
Довідкові типи, як правило, змінюються, але можуть бути розроблені як незмінні, якщо це має сенс. Рядки визначаються як незмінні, оскільки це робить можливими певні оптимізації. Наприклад, якщо один і той же рядковий літерал трапляється кілька разів в одній програмі (що досить часто), компілятор може повторно використовувати той самий об'єкт.
Так чому "==" перевантажений для порівняння рядків за текстом? Тому що це найкорисніша семантика. Якщо два рядки однакові за текстом, вони можуть бути або не бути однаковими посиланнями на об'єкт через оптимізацію. Тому порівнювати посилання досить марно, тоді як порівнювати текст - це майже завжди те, що ви хочете.
Якщо говорити загальніше, Strings має те, що називається семантикою значення . Це більш загальне поняття, ніж типи значень, що є специфікою C # для реалізації. Типи значень мають значення семантики значень, але типи посилань також можуть мати значення семантики. Коли тип має семантику значень, ви не можете реально визначити, чи є базовою реалізацією тип опорного типу або тип значення, тому ви можете врахувати цю деталь реалізації.
is
тести осторонь), відповідь, ймовірно, "з історичних причин". Виконання копіювання не може бути причиною, оскільки немає необхідності фізично копіювати незмінні об’єкти. Тепер неможливо змінити без порушення коду, який фактично використовуєis
чеки (або подібні обмеження).