您的位置:首页 > 编程语言 > C#

值类型和引用类型

2013-10-31 13:57 267 查看
一.值类型

1.定义:一些基本数据类型都是值类型,有固定的长度,如:int、char 、float、decimal、bool、struct,

2.特点:

   a.值类型的数据存储在堆栈上,因为堆栈上存储的是固定商都的数据,而值类型都是固定长度(如:每个int变量都占有4个字节),所以存在堆栈上。

    b.值类型的数据在堆栈上存储的是实际上的值,如 int a=3,那么这个3直接就存放在堆栈上。

  c.值类型变量的赋值,如 int a=9;int b=a;这样的赋值相当于复制了一个a给b,在堆栈中存在两个值相同的变量a和b,所以如果修改a的值不会改变b的值。

二.引用类型:

1.定义:c#中 string 、class、数组等都属于引用类型

2.特点:

  a.引用类型的数据存储在内存堆上,因为内存堆上存储可变长度的数据

  b.引用类型的变量在堆栈上存储的实际上是对象的引用,即内存地址,而引用类型变量的实际数据存储在内存堆上。

  c.对引用类型的赋值,其实就是在堆栈中拷贝一个地址,实际上在堆栈中存在两个具有相同引用地址的对象。详情可看一下实例。

三.值类型和引用类型的区别:

1.值类型的数据只存放在内存的栈内,引用类型的数据则存放在内存的堆内,而内存单元中只存放引用对象的地址。

2.值类型的存取速度快,而引用类型的存取速度慢。

3.值类型隐示继承与system.ValueType,而system.ValueType也是继承system.object,引用类型继承System.object.

4.栈的内存分配是自动释放,而堆在.net中是由GC来释放的

5.值类型的变量直接将值存在堆栈中,而引用类型变量把实际数据的地址保存在堆栈中。而实际的数据则保存在堆中

四.注意:

1.堆和栈是两个不同的概念,在内存中存储位置也不一样,堆一般用于存储可变长度的数据,如:字符串类型,而堆栈则用于存储固定长度的数据,如整数类型的数据int(每个int变量占用四个字节),由数据存储的位置就可以得知:把一个值变量赋值给另一个值变量是,会在堆栈中保存两个完全相同的值,而把一个引用变量赋值给另一个引用变量,则会在堆栈中保存两个具有相同堆位置的引用。即在堆栈中保存的是同一个堆的地址,在进行数据操作时,对于值类型,由于每个变量都有自己的值,因此对一个变量的操作不会影响到另一个变量,对于引用类型的变量,对一个变量的数据操作就是对这个变量在堆中的数据的操作,如果两个对象的引用的在堆中的地址相同,那么相应的另一个对象的值也就变化了,所以对于引用类型的变量来说,对一个变量的操作会影响到引用同一个对象的另一个变量。

五.实例:

  static void Main(string[] args)

        {

            //声明一个值类型

            int a = 3;

            //声明另一个值类型的变量,并且将a的值赋值给他

            int b = a;

            Console.WriteLine("修改b值之前 :a={0},b={1}",a,b );

            //修改b的值,观察a的值会发生变化吗

            b = 8;

            Console.WriteLine("修改b值之后:a={0},b={1}",a,b);

            //声明一个引用类型

            int[] arr1 = { 1, 2, 3 };

            //声明一个引用类型的变量,并且将arr1的值付给他、

            int[] arr2 = arr1;

            Console.WriteLine("修改arr2值之前 :arr1[2]={0},arr2[2]={1}", arr1[2], arr2[2]);

            //修改arr2的值,观察arr1中值的变化

            arr2[2] = 10;

            Console.WriteLine("修改arr2值之前 :arr1[2]={0},arr2[2]={1}", arr1[2], arr2[2]);

            Console.ReadKey();

            

        }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息