码迷,mamicode.com
首页 > Windows程序 > 详细

C# 值类型与引用类型的详解

时间:2015-09-22 06:32:51      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:

         值类型与引用类型分这几种情况:

1.内存分为堆和栈,值类型的数据存储在栈中,引用类型的数据存储在堆中。

2.int numb=10,代码中的10是值类型的数据,numb只是一个指向10的变量而已。其中10存储在栈中,变量numb也存储在栈中。

3.Person p=new Person(),代码中 new Person()所创建的对象存储在堆中,变量p存储在栈中。

4.综合第2点和第3点所有变量都存储在栈中,无论此变量存储的值是值类型和引用类型。

5.值类型包括枚举,结构以及像int,datetime这样的简单类型;引用类型包括类,接口,委托等。

6.值类型传递的值的拷贝,引用类型传递的是值的引用,即此数据在内存中的地址,这是最核心的概念,实例展示:

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
class Program
        {
            static void Main(string[] args)
            {
                Person yaohongbo = new Person() { Name = "姚宏波", Age = 29 };
                Person lilei = new Person() { Name = "李雷", Age = 22 };
     
                int age = yaohongbo.Age;
                yaohongbo.Age = 27;
     
                Person zhangsan = lilei;
                lilei.Name = "李磊";
     
                Console.WriteLine("yaohongbo的age:"+yaohongbo.Age);
                Console.WriteLine("age:" + age);
                Console.WriteLine("lilei的name:" + lilei.Name);
                Console.WriteLine("zhangsan的name:" + zhangsan.Name);
                Console.ReadKey();
            }
        }
        class Person
        {
             
            public string Name { getset; }//引用类型
            public int Age { getset; }//值类型
        }

 

输出结果如下图:

技术分享

代码说明:yaohongbo.Age是int类型,为值类型,所以代码int age=yaohongbo.Age,是将yaohongbo.Age变量存储的值复制了一份,然后让变量age存储这份拷贝,此拷贝和yaohongbo.Age无任何关系,所以我们才可以看到上面的输出结果。

再看代码:

 
 
Person zhangsan = lilei;
              lilei.Name = "李磊";

 

Person为自定义类,为引用类型,而引用类型穿的是引用,变量zhangsan指向的数据和变量lilei是同一个内存地址,即同一个对象,而不是像值类型那样,拷贝了一份变量lilei指向的数据给变量zhangsan。所以才会出现无论更改zhangsan韩式lilei的属性值,其他一个都会改变的情况。

最后通过一张图来描述上面代码。

 

技术分享

 

C# 值类型与引用类型的详解

标签:

原文地址:http://www.cnblogs.com/yanyao/p/4827827.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!