В С# использование типов значений по сравнению с ссылочными типами

Мои вопросы:

  • Когда мы должны использовать типы значений и типы ссылок?
  • Каковы преимущества и недостатки одного над другим?
  • Что делать, если везде используются ссылочные типы? Есть ли в этом вред?

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

Ответ 1

Кажется, у него много замешательства, и Джон Скит неплохо справляется с этим в своей книге "С# In Depth, 2nd Ed". (раздел 2.3).

Мой личный подход, который может или не может быть прав, заключается в ТОЛЬКО использовании структур/перечислений (типов значений) для представления легких, атомных структур данных, которые, как я знаю, я буду часто использовать в каких-то логических или математических операциях - подумайте Point и т.д.

Таким образом, я полагаю, что могу избежать штрафа за сбор мусора. Тем не менее, Джон указывает в этом разделе своей книги, что нет реальной гарантии, особенно в новых версиях среды выполнения, что-то пойдет в стек вообще.

Таким образом, мой лучший ответ - использовать вещи, подобные структурам, экономно и быть очень сознательными, почему вы используете их, если вы это делаете. Следите за преждевременной оптимизацией. И прочитайте этот раздел в книге Джона, если вы можете получить копию, потому что он хорошо проясняет эту тему.

Связано: Когда использовать struct?

Ответ 3

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

Ответ 4

http://www.albahari.com/valuevsreftypes.aspx

Это моя рекомендация по этому вопросу. В основном я использую ссылочные типы tbh. IE классы, а не структуры. Основной вопрос, который часто говорят, заключается в том, что структуры должны использоваться только для небольших фрагментов информации. Действительно зависит от конкретных обстоятельств. Посмотрите на .net-структуру в браузере объектов, которая должна помочь, вы увидите, что сделали ребята из Microsoft, и вы можете проанализировать, почему они создали определенные классы и структуры.

Ответ 5

Неизменяемые типы значений и неизменяемые ссылочные типы семантически одинаковы; единственные различия заключаются в том, что ссылочные типы поддерживают контрольные проверки равенства, которые могут или не могут быть значимыми, и что типы значений могут быть обернуты в Nullable (Of T), в то время как ссылочные типы неявно обнуляются. Если тип будет неизменным, в зависимости от того, как он будет использоваться, могут возникнуть причины для поддержки структуры или класса; structs быстрее для некоторых операций (почти все операции размером менее четырех байт), а классы могут ускоряться для некоторых других (особенно для вещей размером более 16 байт). Кроме того, некоторые типы операций практически невозможны для структур.

Взаимозаменяемые типы структур полезны, вопреки тому, что утверждают некоторые скептики, но есть некоторые оговорки. Если у вас есть переменная, содержащая ссылку на изменяемый объект класса, и кто-то делает что-то, чтобы изменить этот объект, это изменение будет эффективно "видимо" всем, что содержит ссылку на этот объект. Если кто-то хочет изменить объект, не нарушая ничего другого, нужно знать, что он содержит единственную ссылку на этот объект. Часто каждый единственный способ убедиться в этом - скопировать все данные из объекта в экземпляр нового объекта и затем внести изменения в этот новый экземпляр. В отличие от этого, если у вас есть изменяемая структура, можно просто сделать любые изменения, которые вы хотите, не создавая новый экземпляр.

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