在.NET中,"struct"和"class"有什么区别?
.NET 中有两种类型:引用类型和值类型。
结构体(structs)是值类型,而类(classes)是引用类型。
一般的区别在于引用类型存储在堆上,值类型存储在内线(inline),即变量或字段所在之处。
包含值类型的变量包含整个值类型的值。对于结构体,这意味着变量包含整个结构体及其所有字段。
包含引用类型的变量包含一个指针,或者是一个指向内存中实际值所在处的引用。
这有一个好处,首先是:
- 值类型始终包含一个值
- 引用类型可以包含空引用(null-reference),这意味着它们目前不指向任何东西
内部上,引用类型被实现为指针,并且了解了这一点,以及知道变量赋值的工作原理,还有其他的行为模式:
- 复制一个值类型变量的内容到另一个变量中,复制整个内容到新变量中,使两者分开。换句话说,在复制之后,对一个变量的更改不会影响另一个变量
- 复制一个引用类型变量的内容到另一个变量中,复制引用,这意味着现在你有两个指向实际数据存储的同一个地方的引用。换句话说,在复制之后,更改一个引用中的数据似乎也会影响另一个引用,但这只是因为你实际上只是在两个地方看了同样的数据
当你声明变量或字段时,这两种类型有如下不同:
- 变量:值类型存储在堆栈上,引用类型作为指向堆内存中实际内存所在位置的指针存储在堆栈上(尽管请注意,Eric Lippert的文章系列“堆栈是实现细节”的一部分)。
- 类/结构字段:值类型完全存储在类型内部,引用类型作为指向堆内存中实际内存所在位置的指针存储在类型内部。