В C # использование типов значений по сравнению с ссылочными типами - PullRequest
10 голосов
/ 19 января 2011

Мои вопросы:

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

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

Ответы [ 5 ]

9 голосов
/ 19 января 2011

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

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

7 голосов
/ 19 января 2011

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

4 голосов
/ 19 января 2011

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

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

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

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

Похожие: Когда использовать struct?

2 голосов
/ 19 января 2011

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

это моя справка по этому вопросу.Я в основном использую справочные типы ТБХ.IE классы, а не структуры.Главное, что часто говорят, это то, что структуры должны использоваться только для небольших фрагментов информации.Действительно зависит от точных обстоятельств.Посмотрите на .net Framework в браузере объектов, который должен помочь, вы увидите, что сделали ребята из Microsoft, и сможете проанализировать, почему они создали определенные классы и структуры.

1 голос
/ 26 января 2011

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

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

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

...