值类型
值类型(包括所有的数值类型、枚举和结构)都分配在栈上。所以值类型一旦离开其定义的作用域,立即就会从内存中删除
当一个值类型赋值给另一个值类型的时候,默认情况下完成的是一个成员到另一个成员的复制。
引用类型
引用类型分配在托管堆上。其对象一直保留在内存中,直到.NET垃圾回收器将它们销毁。默认情况下,一个引用类型的赋值将new出一个对该堆上同一个对象的新引用(new关键字返回的是一个指向堆上对象的引用,而不是真正的对象本身。这个引用变量保存在栈内,以供程序以后使用)。
包含引用类型的值类型
该值类型的复制过程中,值类型依旧完成一个成员到另一成员的复制,而引用类型依旧是new出一个对堆上同一对象的引用的。
默认情况下,当值类型包含其他引用类型时,赋值将生成一个引用的副本。这样就有两个独立的结构,每一个都包含指向内存中同一个对象的引用(浅复制)。
按值传递引用类型
其实该方式也是一种成员到另一成员的复制。只不过其复制的不是成员的值(状态),而是指向调用对象的引用。相当于复制了一个新的实参实例。该实例与实参一样指向堆上同一对象。
按引用传递引用类型
该方式传递的是引用类型的本身。通过使用ref关键字,传入的是参数对象本身。
如果按引用传递引用类型,被调用者可能改变对象的状态数据的值和所引用的对象