C#值类型与引用类型
C#类型
C#类型中分两种:值类型,引用类型。所有值类型 都隐式的继承自 System.ValueType
,所有类型 都继承自 System.ObjectType
。
栈与堆
堆存储的是为引用类型的实例分配的内存
栈上存储的是变量。变量分值类型变量,和引用类型变量。引用类型变量存储了对实例的引用。当声明一个值类型变量的时候,变量本身包含了值类型的全部字段。
1. 值类型
值类型包括结构和枚举,还有一种特殊值类型(简单类型), 比如int,byte等。
值类型需要注意以下几点:
- 声明变量其实并为入栈。赋值=入栈,取值=出栈
- 调用结构上的方法前,需要对其所有的字段进行赋值
- 结构 SampleStruct, new SampleStruct() 仅仅隐式的给结构上的所有字段赋值
2. 引用类型
引用类型包括类,接口,委托等。
对象判等
- 引用类型
string 类型的判等比较特殊。并非比较引用地址,而是比较值。
- 引用类型
对象复制
浅度复制
对象的成员有可能是值类型,有可能是引用类型。当对对象进行一个浅度复制的时候,对于值类型成员,会复制其本身(值类型变量本身包含了所有数据,复制时进行按位复制);对于引用类型成
员(注意它实际只是一个对象引用,指向了堆上的对象实例),仅仅复制引用,而不在堆上重新创建对象。因此,浅度复制结果就是:新对象的引用成员和复制对象的引用成员指向了同一个对象。深度复制
不可变类型
string 类型是一个特殊的引用类型——不可变类型。每次值改变都会创建一个新的对象实例,StringBuilder则不会。
在string类型作为方法参数的时候,需要特别注意。