2011-01-19 87 views
10

我的问题是:在C#中,使用的值类型与引用类型

  • 我们什么时候应该使用值类型和引用类型时?
  • 其中一个优点和缺点是什么?
  • 如果在任何地方都使用参考类型会怎样?它有什么伤害吗?

请同时讨论每一个的优缺点。我也想明白这一点。

+2

如果你不能决定,它几乎肯定是一个`类`。 *合法*写一个结构是非常罕见的。 – 2011-01-19 19:10:15

+1

对于土耳其程序员,我有一篇关于它的博客文章http://sonergonul.net/2012/12/net-icerisinde-deger-tipi-ve-referans-tipi/ – 2012-12-06 16:04:49

回答

4

对此,似乎存在很多混淆,Jon Skeet在他的书“C#深度第二版”中做了很好的清理工作。 (第2.3节)。

我个人的方法可能是也可能不是正确的,只是使用结构体/枚举(值类型)来表示轻量级的原子数据结构,我知道我会经常以某种逻辑或数学方式使用操作 - 认为Point

这样我我可以避免垃圾收集性能的损失。然而,Jon在他的书中指出,没有真正的保证,特别是在新版本的运行时中,是否会出现一些问题。

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

相关:When to use struct?

7

使用不具有自己身份的不可变对象的值类型(a 1是1),对其他事物使用引用类型。

+5

字符串是否有身份? :) – 2011-01-19 18:39:46

2

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

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

1

不可变值类型和不可变的引用类型是语义上所有的但相同的;唯一的区别是引用类型支持可能有意义或不可能有意义的引用相等性检查,并且值类型可能包含在Nullable(Of T)中,而引用类型可隐式地为空。如果一个类型是不可变的,取决于它将如何使用,可能会有性能方面的原因来支持结构或类;对于某些操作(几乎所有操作,对于小于四个字节的大小),结构体的速度更快,而对于其他类(特别是对于大于16字节的东西),类可能会更快。而且,一些类型的操作在结构中基本上是不可能的。

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

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