11

我的问题是:

  • 我们什么时候应该使用值类型,什么时候应该使用引用类型?
  • 一个比另一个有什么优点和缺点?
  • 如果在任何地方都使用引用类型怎么办?它有什么害处吗?

还请讨论每种方法的优缺点。我也想明白这一点。

4

5 回答 5

9

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

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

于 2011-01-19T18:38:54.843 回答
7

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

于 2011-01-19T18:38:31.417 回答
6

对此似乎有很多困惑,Jon Skeet 在他的书“C# In Depth, 2nd Ed”中很好地解决了这个问题。(第 2.3 节)。

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

这样我认为我可以避免垃圾收集性能损失。然而,Jon 在他书中的那部分指出,并不能真正保证,尤其是在运行时的新版本中,是否有东西会进入堆栈。

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

相关:何时使用结构?

于 2011-01-19T18:58:24.623 回答
2

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

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

于 2011-01-19T18:41:43.717 回答
1

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

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

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

于 2011-01-26T18:46:23.110 回答