在C#中,使用值类型与引用类型

时间:2011-01-19 18:36:25

标签: c# class-design value-type reference-type

我的问题是:

  • 我们什么时候应该使用值类型和引用类型?
  • 一个人的优点和缺点是什么?
  • 如果在任何地方使用引用类型怎么办?它有什么危害吗?

还请讨论每一个的优点和缺点。我也想了解这一点。

5 个答案:

答案 0 :(得分:9)

您应该为表示值的小型不可变类型使用值类型 Never make mutable structs

对于其他所有内容,请使用引用类型。

答案 1 :(得分:7)

对不具有自己标识的不可变项使用值类型(1为1),对其他事物使用引用类型。

答案 2 :(得分:4)

似乎对此存在很多困惑,Jon Skeet在他的书“C#In Depth,2nd Ed”中做了很好的清理工作。 (第2.3节)。

我的个人方法,可能是也可能不对,只是使用结构/枚举(值类型)来表示我知道我将经常在某种逻辑或数学运算中使用的轻量级原子数据结构 - 想想Point等等。

这样我认为我可以避免垃圾收集性能损失。然而,Jon在他的书的那一部分中指出,没有真正的保证,特别是在新版本的运行时,是否会出现堆栈中的某些内容。

所以我最好的答案是谨慎地使用结构之类的东西,并且非常清楚为什么你使用它们。注意过早优化。如果你能得到一份副本,请阅读Jon的书中的那一部分,因为他在澄清这整个主题方面做得很好。

相关:When to use struct?

答案 3 :(得分:2)

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

这是我在这一点上的参考。我主要使用引用类型tbh。 IE类而不是结构。经常说的主要观点是结构应该只用于小块信息。真的取决于具体情况。看一下应该有用的对象浏览器中的.net框架,你会看到微软人员做了什么,你可以分析他们创建某些类和结构的原因。

答案 4 :(得分:1)

不可变值类型和不可变引用类型在语义上几乎完全相同;唯一的区别是引用类型支持可能有意义或可能没有意义的引用相等性检查,并且值类型可以包装在Nullable(Of T)中,而引用类型可隐式为可空。如果一个类型将是不可变的,取决于它将如何被使用,可能有性能原因支持结构或类;对于某些操作(几乎所有操作,对于小于4个字节的大小),结构更快,而对于其他操作,类可能更快(特别是对于大于16字节的事物)。此外,某些类型的操作基本上不可能使用结构。

可变结构类型是有用的,与一些反对者声称的相反,但有一些警告。如果有一个变量持有对可变类对象的引用,并且有人做了一些改变该对象的事情,则该变化将被持有对该对象的引用的所有内容“有效”地看到。如果一个人希望在不打扰其他任何东西的情况下改变一个物体,就必须知道一个人只拥有该物体的唯一参考物。通常,确保这一点的唯一方法是将对象中的所有数据复制到新的对象实例中,然后对该新实例进行更改。相比之下,如果一个人有一个可变的结构,那么人们可以简单地进行任何想要的改变,而不必创建新的实例。

可变结构的唯一真正问题是.net使用各种抽象使它们表现为统一类型系统的一部分,并且这些抽象可能导致结构的副本用于逻辑上应该使用原件的地方。当这些替换可能发生时并不总是显而易见的,并且它们可能导致混乱和错误的行为。