概述
一丶基元类型。
什么叫基元类型:生成的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.由于未装箱的值类型不在堆上分配,一量定义了该类型的一个实例的方法不再活动,为为它们分配的存储就会被释放,而不是等着垃圾回收。
最后
以上就是傲娇玫瑰为你收集整理的三丶基元类型、值类型和引用类型的全部内容,希望文章能够帮你解决三丶基元类型、值类型和引用类型所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复