三丶基元类型、值类型和引用类型

一丶基元类型。

什么叫基元类型:生成的IL(ildasm.exe)代码还与源码完全一致,例如:int a=0,生成的il也为 int a=0,编译器直接支持的数据类型称为基元类型。基元类型直接映射到Framework的类库中存在的实例。

c#语言对应的FCL:byte 、short、int、long、char、float、double、bool、decimal、string、object、dynamic.

二丶值类型和引用类型

CLR支持两种类型:值类型和引用类型,平常FCL的大多数类型是引用类型,但程序员用得最多的就是值类型,引用类型托管堆里面分配的,C#的new操作符返回对象的内存地址-即指向的对象数据的内存地址。

引用类型:

1.内存必须从托管堆里面分配

2.堆上分配的对象有一些初始成员,而且必须初始化。

3.对象中的其他字节总是设为零。

4.从托管堆中分配对象时,可能强制执行一次垃圾回收。

引用类型:任何称为“类”的类型都是引用类型。

值类型:值类型称为结构或者枚举。

 

class Product{ public int id;}    //这是一个引用类型
 
 
struct Price{ public int id;}  //这是一个值类型
 
 
static void Test(){
	Product p=new Product(); //在托管堆上面分配
	Price p1=new Price(); //在线程栈上面分配  	
	p.id=5;
	p1.id=7;  
}
			线程栈						托管堆
		          p-------------------------------------------→类型对象指针同步索引快 id=5
			p1 p1.id=7
	Price p1=new Price()
	这段代码似乎是要在托管堆中分配实例,但是Price是结构,值类型,只会在线程栈中分配 。而且p1已经初始化为零了。
	Price p1; 	
	同样是在线程栈中分配,只不过并未将字段初始化。
 
 
	值类型和引用类型的一些区别:
	1.值类型对象有两种表示形式:未装箱和已装箱,引用类型就一直处于装箱。
	2.值类型才System.ValueType派生。该类提供了System.Object相同的方法。但System.ValueType重写了Equals方法,能在两个对象的字段值完全莱西的前提下返回True。
	3.由于不能将值类型作为基类型来定义新的值类型或者新的引用类型,所以不在值类型中引入任何新的虚方法。所有方法都不能是抽象的,所有方法都隐匿密封。
	4.引用类型的变量包含堆中的对象地址。引用类型的变量创建时默认初始化为,表明当前不指向有效对象。
	5.将值类型变量赋给另一个值类型变量,会执行逐字段的复制。将引用类型的变量给另一个引用类型的变量只复制内存地址。
	6.基于上一条,两个或多个引用类型变量能引用堆中的一个对象,所以对一个变量执行的操作可能影响到中坚力另一个变量的引用对象,相反,值类型不会出现影响。
	7.由于未装箱的值类型不在堆上分配,一量定义了该类型的一个实例的方法不再活动,为为它们分配的存储就会被释放,而不是等着垃圾回收。
 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值