关于 值类型 和 引用类型

不理解引用类型和值类型区别 的程序员将会给代码引入 诡异的bug和性能问题(也就是我们编程过程中所说的“灵异事件”)
---某大神如是说

废话不多说,先上代码:

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.引用类型变量的赋值只复制对对象的引用,而不复制对象本身。引用类型的多个对象指向同一个地方时,修改某一个的时候,其它对象的值会发生改变。而将一个值类型变量赋给另一个值类型变量时,将复制包含的值。
posted @ 2017-01-01 04:50  乔高建  阅读(350)  评论(0编辑  收藏  举报