C# 值类型和引用类型
2016-06-17 08:39
323 查看
一、基本概念
C#只有两种数据类型:值类型和引用类型值类型在线程栈分配空间,引用类型在托管堆分配空间
值类型转为引用类型称成为装箱,引用类型转为值类型称为拆箱
以下是值类型和引用类型对照表
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、装箱:就是将值类型的数据打包到引用类型的实例中( 比如将int类型的值1赋给object对象obj)int i=1; object obj=(object)i;
装箱时到底发生的事情:
1)、在托管堆中分配内存。分配的内存量是值类型各字段所需的内存量,还要加上托管堆所有对象都有的两个额外成员(类型对象指针和同步块索引)所需的内存量
2)、值类型的字段复制到新分配的堆内存
3)、返回对象地址,现在该地址是对象引用;值类型成了引用类型
2、拆箱:就是从引用数据中提取值类型(比如将object对象obj的值赋给int类型的变量i)
object obj=”1”; int i=(int)obj;
拆箱不是装箱过程倒过来,拆箱的代价爱比装箱低的多,拆箱是获取指针的过程,该指针指向包含在一个对象中的原始值类型。
拆箱后将堆中的字段包含的值复制栈的值类型实例中。
3、值类型变为引用类型不一定要装箱,例如:
string str = "joye.net" + 26; //需要将26装箱为string类型 string str1 = "joye.net" + 26.ToString(); //tostring后不需要装箱
感兴趣的可以用IL看一下。
三、参考资料
《深入理解C#》第二版《CLR VIA C#》第四版
《C# 高级编程》第四版
还有很多网络上的文章,就不一一例举了
相关文章推荐
- C# 连接FTP 时 关于路径的问题
- RAML用户应遵循的C#与Web API代码生成模式
- C#使用结构体,输入5个人的学号,姓名,分数,按照成绩高低排列打印出来
- 学习笔记之C# 子窗口调用父窗口变量
- C#之多态
- 关于C#中的new的用法
- C#获取运行程序的进程ID
- c#CheckedListBox单选多选个数限制问题
- C# 读取快捷方式指向的文件
- 转 C# 装箱和拆箱[整理]
- c#checkedListBox设置限制选项个数的问题
- C#MVC中Controler的自定义属性使用
- 练习、C# 结构体、冒泡排序
- C#中的代理
- C# 生成随机索引列表
- 关于C#对图片部分操作(水印、透明度)
- U3D结合第三方库ICSharpCode.SharpZipLib 实现文件夹打包解包
- C# UDP收发请求工具类
- C# 多线程是否结束可通过线程池可以判断
- VS2015中C#版本6.0的新特性 你需要知道