码迷,mamicode.com
首页 > 其他好文 > 详细

值类型和引用类型的区别

时间:2015-11-27 21:56:19      阅读:269      评论:0      收藏:0      [点我收藏+]

标签:

      数据项的类型定义了存储数据需要的内存大小,组成该类型的数据成员以及该类型能执行的函数。类型还决了对象在内存中的存储位置-栈或堆。

      类型被分为:值类型和引用类型,这两种类型的对象在内存中的存储方式不同。值类型只需要一段单独的内存,用于存储实际的数据,引用类型需要两段内存:第一段存储实际的数据,它总是位于堆中,第二段是一个引用(即内存地址,不懂是不是就是直接寻址),指向数据在堆中的存放位置。

      如果数据不是其他类型的成员,是独立的,比如方法代码块声明的临时变量int age ;如果是某一类型的成员,,如class Person{ private int age;public int AGE{get{rerurn age;}set{age=value;}}},对于第一种情况数据存储方式为:对于值类型,数据存放在栈里,如果是引用类型,实际数据存放在堆里,引用(指向实际数据的内存地址)存放在栈里。然而第二种情况,引用类型的对象会数据部分始终存放在堆里,值类型对象,或引用类型数据的引用部分可以存放在堆里,也可以存放在栈里,依赖于实际环境,以上的Person类的成员age,age为int,虽然是值类型,但是它是Person实例数据的一部分,因此和对象的数据一起放在堆里。

      对于引用类型的任何对象,它所有的数据成员都存放在堆里,无论是值类型还是引用类型。

      以下的代码验证值类型和引用类型不同的存储方式:

 public class Valuechange_forward
    {
         private int numone;
         public int NumOne
         {
             get { return numone; }
             set { numone = value; }
         }

    }
   public struct Value_keep
    {
        private int numtwo;
        
        public int NumTwo
        {
            get {return numtwo;}
            set { numtwo = value; }
           
        
        }
 static void Main(string[] args)
        {
            Valuechange_forward demo_forward = new Valuechange_forward();
            demo_forward.NumOne = 8888;
            Valuechange_forward test_foward=demo_forward;
            test_foward.NumOne=666;
            
            Value_keep demo_keep = new Value_keep();
            demo_keep.NumTwo=555;
            Value_keep test_keep=demo_keep;
            demo_keep.NumTwo = 222;
            

            Console.WriteLine("引用类型:自定义类Valuechange_forward,实例demo_forward.NumOne=8888,令 Valuechange_forward test_foward=demo_forward; test_foward.NumOne=666;赋值后demo_forward.NumOne={0},test_forward={1}",demo_forward.NumOne, test_foward.NumOne);

            Console.WriteLine("值类型:自定义structValue_keep,实例demo_keep.NumTwo=555,令 Value_keep test_keep=demo_keep;demo_keep.NumTwo = 222;赋值后demo_keep.NumTwo={0},test_keep={1}", demo_keep.NumTwo, test_keep.NumTwo);
            Console.ReadLine();

        }

技术分享

值类型和引用类型的区别

标签:

原文地址:http://www.cnblogs.com/ypcute/p/5001739.html

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