c#中的一些基本概念

Tom Archer写的《C#技术内幕》,通俗易懂,翻译行文流畅,菜鸟如我也能顺利地读下去,不错。觉得有些东西还是值得边读边记的,留作以后参考。


C#中的数值类型与引用类型


数值类型:数值类型类似C中的变量类型,当声明一个数值类型的时候,是在栈上分配相应的存储空间,并且后续的操作都是直接针对这些已分配的位。传递一个数值类型的变量时,传递的是该变量的值,而不是对包含其对象的引用。数值类型有基本类型、枚举、结构等。


引用类型:引用类型类似一个指针,指向要引用的对象,引用变量的值是指向某个“堆”的首地址。声明引用类型时,会先在“栈”中分配这个引用变量的空间,如前所述,这只是个指针,指向要应用的对象在堆中的首地址。操作时是直接与该对象的引用打交道,而不是分配的位。引用类型主要有:类、数组、代表、接口等。


装箱与开箱

由来:C#是完全面向对象的。这一点有好处,也有缺点。如果只是随便定义一个Int32的整数也需要创建一个对象的话,显然会降低效率,不如数值类型来的明快,直接对位操作就行。曾经有其他语言做过尝试,将处理的一切单纯看做对象,事实证明,这样的效率是极低的。.NET的“公共类型系统”(Common Type System,CTS)采用了将类型分组的方法,即分为数值类型和引用类型。当简单操作数值时,就用数值类型,当需要对这个数值进行复杂操作时,就把这个数值类型转换为引用类型(也就是说数值类型和引用类型是可以相互转换的),这样就将两种情况分来了。而这个双向的动作分别有名称:装箱和开箱。

装箱就是将数值类型转换为引用类型。

开箱就是将引用类型转换为数值类型。

其中,装箱要用到C#中的一个基类:System.Object。这个类无处不在,只要有C#的程序就会有这个类。一切的变量、类、方法都是继承自这个类。装箱:

int foo = 42;//将foo声明为数值类型

object bar = foo;//将bar声明为应用类型,并将foo装箱为bar,其中bar的引用变量值是它自己在堆中的首地址,而其包含的数据值是foo的值42

开箱的时候类似类型转换,将object的变量转换为相应的形式。为了保证转换的正确,需要显示转换:

int foo = 42;

object bar = foo;

int foo2 = (int) bar;//将bar开箱,把其中包含的数据值赋给foo2,而不是其引用变量值(堆首地址)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值