标签:
数据项的类型定义了存储数据需要的内存大小,组成该类型的数据成员以及该类型能执行的函数。类型还决了对象在内存中的存储位置-栈或堆。
类型被分为:值类型和引用类型,这两种类型的对象在内存中的存储方式不同。值类型只需要一段单独的内存,用于存储实际的数据,引用类型需要两段内存:第一段存储实际的数据,它总是位于堆中,第二段是一个引用(即内存地址,不懂是不是就是直接寻址),指向数据在堆中的存放位置。
如果数据不是其他类型的成员,是独立的,比如方法代码块声明的临时变量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