不理解引用类型和值类型区别 的程序员将会给代码引入 诡异的bug和性能问题(也就是我们编程过程中所说的“灵异事件”)---某C#大神如是说
废话不多说,先上代码:
Program类
class Program
{
static void Main(string[] args)
{
//这里是引用Human类的属性 不论他们是什么类型 在这里都是引用类型
Human man1 = new Human(); //实例化man1并给属性赋值
man1.name = "Michael";
man1.age = 24;
Human man2 = man1; //本质上是把man2的地址指向man1地址指向的堆里的内容 这里man2 name 为michael age为24
man1.name = "Qiao"; //man1地址堆里的内容改变了 也就意味着man2所指向的内容也改变了
man1.age = 18;
Console.WriteLine("man1:{0}/t{1}",man1.name,man1.age);
Console.WriteLine("man2:{0}/t{1}",man2.name,man2.age);
//这里是类中自己的变量
//string是一种特殊的引用类型 改变的是栈中的引用 堆中的数据并未改变
string name = "siki";
string name2 = "taikr";
name2=name;
name = "google"; //在这里相当于 name2=new name2(); 重新又定义了一个字符串 而不是改变原有的堆中的值
//值类型 改变的是实际数值
int age = 24;
int age2 = age;
age2 = 25;
age = 20;
Console.WriteLine("name={0},name2={1}",name,name2);
Console.WriteLine("age={0},age2={1}", age, age2);
Console.ReadKey();
}
}
Human类
class Human
{
public string name = "Michael";
public int age = 20;
}
输出结果
man1:Qiao/t18
man2:Qiao/t18
name=google,name2=siki
age=20,age2=25
概念
-
值类型
值类型(value type):直接将内存存储在栈内,由系统自动释放资源的数据类型.基本数据类型赋值都属于值传递,值传递传递的是实实在在的变量值,是传递原参数的拷贝,值传递后,实参传递给形参的值,形参发生改变而不影响实参。
值类型包括:byte,short,int,long,float,double,decimal,char,bool 和 struct 统称为值类型。值类型变量声明后,不管是否已经赋值,编译器为其分配内存。
-
引用类型
引用类型(reference type): 引用类型之间赋值属于引用传递。引用传递传递的是对象的引用地址,也就是它的本身(自己最通俗的理解)。引用传递:传的是地址,就是将实参的地址传递给形参,形参改变了,实参当然被改变了,因为他们指向相同的地址。
引用类型和C语言的指针很相像,当声明一个类时,只在栈中分配一小片内存用于容纳一个地址,而此时并没有为其分配堆上的内存空间。当使用 new 创建一个类的实例时,分配堆上的空间,并把堆上空间的地址保存到栈上分配的小片空间中。
区别
- 1.它们存储的位置不一样,值类型一般储存在栈中,引用类型的指针在栈空间,值在堆空间
- 2.引用类型变量的赋值只复制对对象的引用,而不复制对象本身。引用类型的多个对象指向同一个地方时,修改某一个的时候,其它对象的值会发生改变。而将一个值类型变量赋给另一个值类型变量时,将复制包含的值。