Типы значений или ссылочные типы?Структуры или классы?Когда вы должны использовать каждый?Это не C ++, в котором вы определяете все типы как типы значений и можете создавать ссылки на них.Это не Java, в которой все является ссылочным типом (если вы не являетесь одним из разработчиков языка).Вы должны решить, как будут вести себя все экземпляры вашего типа при его создании.Это важное решение, чтобы получить право с первого раза.Вы должны согласиться с последствиями своего решения, потому что изменение позже может привести к тому, что немало кода сломается неуловимым образом.Это просто вопрос выбора ключевого слова struct или class при создании типа, но гораздо сложнее обновить все клиенты, использующие ваш тип, если вы измените его позже.
Это не так просто, как предпочесть одно из нихдругой.Правильный выбор зависит от того, как вы ожидаете использовать новый тип.Типы значений не являются полиморфными.Они лучше подходят для хранения данных, которыми манипулирует ваше приложение.Типы ссылок могут быть полиморфными и должны использоваться для определения поведения вашего приложения.Подумайте об ожидаемых обязанностях вашего нового типа, и исходя из этих обязанностей, решите, какой тип создать.Структуры хранят данные.Классы определяют поведение.
Предположим, вы читаете что-то фантастическое и хотите, чтобы друг тоже это прочитал.Предположим также, что это документ, находящийся в свободном доступе, просто чтобы избежать обвинений в поддержке нарушения авторских прав.Что нужно дать своему другу, чтобы он тоже мог это прочитать?Это полностью зависит от того, что вы читаете.
Сначала мы разберемся со случаем, когда у вас в руках будет настоящая бумага.Чтобы дать своему другу копию, вам нужно фотокопировать все страницы, а затем передать его ему.В этот момент у него есть собственная полная копия документа.В этой ситуации мы имеем дело с поведением типа значения.Вся информация находится в ваших руках - вам не нужно никуда идти, чтобы получить ее.Ваша копия информации также не зависит от вашей подруги после того, как вы ее сделали.Вы можете добавить некоторые заметки на свои страницы, и его страницы не будут изменены вообще.
Сравните это с ситуацией, когда вы читаете веб-страницу.На этот раз все, что вы должны дать своему другу, это URL веб-страницы.Это поведение ссылочного типа, где URL заменяет ссылку.Для того, чтобы действительно прочитать документ, вы должны перемещаться по ссылке, поместив URL-адрес в браузер и попросив его загрузить страницу.С другой стороны, если веб-страница по какой-то причине изменится (представьте, что это вики-страница, и вы добавили свои заметки на страницу), вы и ваш друг увидите это изменение в следующий раз, когда каждый из вас загрузит страницу.
Различия, которые мы наблюдали в реальном мире, составляют суть различий между типами значений и ссылочными типами в C # и .NET.Большинство типов в .NET являются ссылочными типами, и вы, вероятно, создадите гораздо больше ссылок, чем типов значений.Наиболее распространенные случаи, которые нужно знать, это то, что классы (объявленные с использованием класса) являются ссылочными типами, а структуры (объявленные с использованием struct) являются типами значений.Другие ситуации следующие:
Типы массивов являются ссылочными типами, даже если тип элемента является типом значения (поэтому int [] по-прежнему является ссылочным типом, даже если int является типом значения).
Перечисления (объявленные с использованием enum) являются типами значений.
Типы делегатов (объявленные с использованием делегата) являются ссылочными типами.
Типы интерфейса (объявленные с использованием интерфейса) являются ссылочными типами, но ониможет быть реализовано с помощью типов значений.
Теперь, когда у нас есть базовое представление о том, что такое ссылочные типы и типы значений,мы рассмотрим некоторые из самых
важные детали.