2011-01-19 4 views
10

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

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

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

+2

Если вы не можете решить, это почти наверняка «класс». Это невероятно редко * законно * писать структуру. –

+1

Для турецких программистов у меня есть сообщение в блоге об этом http://sonergonul.net/2012/12/net-icerisinde-deger-tipi-ve-referans-tipi/ –

ответ

4

Похоже, что существует много путаницы, и Джон Скит неплохо справляется с этим в своей книге «C# In Depth, 2nd Ed.». (раздел 2.3).

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

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

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

Связанные: When to use struct?

7

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

+5

Если строки имеют идентификаторы? :) –

+0

Итак, '' 1 "' не является '" 1 "'? – jason

+0

@Jon - особый случай ... и можно утверждать, что строки должны были быть реализованы как типы значений. Хотелось бы услышать, как вы его принимаете. – Oded

9

Вы должны использовать типы значений для малых, неизменяемых типов, которые представляют значения.
Never make mutable structs.

Для всего остального используйте ссылочные типы.

+1

+1 с акцентом на * small *. (copy-on-assign) –

+1

Ваше сообщение не объясняет, почему нужно использовать типы значений? – Nawaz

2

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

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

1

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

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

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