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

我的问题是:

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

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

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

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

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

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

相关: 何时使用struct?

您应该为表示值的小的不可变类型使用值类型。
永远不要制作可变的结构 。

对于其他一切,请使用引用类型。

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

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

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

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

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

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