手机
当前位置:查字典教程网 >编程开发 >C#教程 >浅谈C#中的值类型和引用类型
浅谈C#中的值类型和引用类型
摘要:一、基本概念C#只有两种数据类型:值类型和引用类型值类型在线程栈分配空间,引用类型在托管堆分配空间值类型转为引用类型称成为装箱,引用类型转为...

一、基本概念

C#只有两种数据类型:值类型和引用类型

值类型在线程栈分配空间,引用类型在托管堆分配空间

值类型转为引用类型称成为装箱,引用类型转为值类型称为拆箱

以下是值类型和引用类型对照表

浅谈C#中的值类型和引用类型1

从上图可以简单看出:string,Object,数组,class是引用类型,简单类型,枚举,结构是值类型。

二、代码展示

定义一个类和结构调用赋值

浅谈C#中的值类型和引用类型2

内存分配情况如下图:

浅谈C#中的值类型和引用类型3

从这张图可以看出,class实例化出来的对象,指向了内存堆中分配的空间;truct实例化出来的对象,是在内存栈中分配。

修改代码如下:

浅谈C#中的值类型和引用类型4

内存分配情况:

浅谈C#中的值类型和引用类型5

由上图可以知:

复制代码 代码如下:

object obj=”abc”;

string i=(string)obj;

值类型和引用类型储的位置不一样

如果是引用类型,当两个对象指向同一个地方,修改某一个的时候,其它对象的值会发生改变

using System; namespace ConsoleApplication2 { //引用类型(因为‘class') public class SomeRef { public int x { get; set; } } //值类型(因为‘struct') public struct SomeVal { public int x{ get; set; } } class Program { static void Main(string[] args) { SomeRef r1=new SomeRef(); //在堆上分配 SomeVal v1 = new SomeVal();//在栈上分配 r1.x = 5; //提领指针 v1.x = 5; //在栈上修改 Console.WriteLine(r1.x); //显示5 Console.WriteLine(v1.x); //显示5 SomeRef r2 =r1; //只复制引用(指针) SomeVal v2 =v1; //在栈上分配并赋值成员 r1.x = 8; //r1.x和r2.x都会修改 v1.x = 8; //v1.x会更改,v2.x不会 Console.WriteLine(r1.x); //显示8 Console.WriteLine(r2.x); //显示8 Console.WriteLine(v1.x); //显示8 Console.WriteLine(v2.x); //显示5 Console.ReadKey(); } } }

三、值类型装箱、拆箱

1、装箱:就是将值类型的数据打包到引用类型的实例中(比如将string类型的值abc赋给object对象obj)

复制代码 代码如下:String i=”abc”;

object obj=(object)i;

装箱时到底发生的事情:

1)、在托管堆中分配内存。分配的内存量是值类型各字段所需的内存量,还要加上托管堆所有对象都有的两个额外成员(类型对象指针和同步块索引)所需的内存量

2)、值类型的字段复制到新分配的堆内存

3)、返回对象地址,现在该地址是对象引用;值类型成了引用类型

2、拆箱:就是从引用数据中提取值类型(比如将object对象obj的值赋给string类型的变量i)

复制代码 代码如下:object obj=”abc”;

string i=(string)obj;

拆箱不是装箱过程倒过来,拆箱的代价爱比装箱低的多,拆箱是获取指针的过程,该指针指向包含在一个对象中的原始值类型。

拆箱后将堆中的字段包含的值复制栈的值类型实例中。

3、值类型变为引用类型不一定要装箱,例如:

复制代码 代码如下:string str = "joye.net" + 26; //需要将26装箱为string类型

string str1 = "joye.net" + 26.ToString(); //tostring后不需要装箱

感兴趣的可以用IL看一下。

【浅谈C#中的值类型和引用类型】相关文章:

c# 引用类型构造器

C#中判断某类型是否可以进行隐式类型转换

C#位移的介绍与例子

浅谈C#泛型的用处与特点

解析C#中的ref和out参数

C#中的where泛型约束介绍

浅谈c# 泛型类的应用

C#.net中的类型转换详细介绍

浅谈c#.net中巧用ToString()将日期转成想要的格式

C#加密在实际中的应用

精品推荐
分类导航