值类型和引用类型
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();
}
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();
}
相关文章推荐
- 值类型和引用类型,栈和堆的含义
- 值类型和引用类型
- 值类型与引用类型
- .NET面试题解析(01)-值类型与引用类型
- string 值类型还是引用类型?
- Emit学习-答疑篇-值类型和引用类型在使用时的区别
- 值类型与引用类型
- 值类型\引用类型\抽象方法\虚方法
- 接口和抽象类,值类型和引用类型,委托,反射,装箱和拆箱
- 值类型和引用类型
- 值类型引用类型List Remove 方法Remove不掉哪一个项。
- 值类型和引用类型
- 值类型和引用类型的区别
- 读书笔记_CLR.via.c#第五章_基元类型_引用类型_值类型
- 值类型和引用类型小解
- C#初学――值类型和引用类型
- 140831●值类型、引用类型
- C# 引用类型 vs 值类型
- NET-OOP:.属性、方法、值类型和引用类型
- 值类型和引用类型和数据大小排名