C#值类型与引用类型

C#值类型与引用类型

C#类型

C#类型中分两种:值类型,引用类型。所有值类型 都隐式的继承自 System.ValueType所有类型 都继承自 System.ObjectType

栈与堆
堆存储的是为引用类型的实例分配的内存
栈上存储的是变量。变量分值类型变量,和引用类型变量。引用类型变量存储了对实例的引用。当声明一个值类型变量的时候,变量本身包含了值类型的全部字段。

1. 值类型

值类型包括结构和枚举,还有一种特殊值类型(简单类型), 比如int,byte等。

值类型需要注意以下几点:
    - 声明变量其实并为入栈。赋值=入栈,取值=出栈
    - 调用结构上的方法前,需要对其所有的字段进行赋值
    - 结构 SampleStruct, new SampleStruct() 仅仅隐式的给结构上的所有字段赋值

2. 引用类型

引用类型包括类,接口,委托等。

  1. 对象判等

    • 引用类型
      string 类型的判等比较特殊。并非比较引用地址,而是比较值。
  2. 对象复制

    • 浅度复制
      对象的成员有可能是值类型,有可能是引用类型。当对对象进行一个浅度复制的时候,对于值类型成员,会复制其本身(值类型变量本身包含了所有数据,复制时进行按位复制);对于引用类型成
      员(注意它实际只是一个对象引用,指向了堆上的对象实例),仅仅复制引用,而不在堆上重新创建对象。因此,浅度复制结果就是:新对象的引用成员和复制对象的引用成员指向了同一个对象。

    • 深度复制

  3. 不可变类型

    string 类型是一个特殊的引用类型——不可变类型。每次值改变都会创建一个新的对象实例,StringBuilder则不会。
    在string类型作为方法参数的时候,需要特别注意。