用每个基类型去核对指定的类型. 2、as操作符 为了简化is操作符的做法

时间:2021-12-23 08:30:03

CLR要求所有的东西都通过new来创建,代码如下:

Object obj=new Object();

以下是new操纵符做的工作

1、计算类型及其所有基类型(一直到System.Object,虽然它没有界说本身的实例字段)中界说的所有实例字段需要的字节数.堆上每个东西都需要一些特别的成员,包孕“类型东西指针”和"同步索引块"。CLR操作这些成员打点东西.特别成员的字节数要计入东西的巨细.

2、从托管堆中分配类型要求的字节数,从而分配东西的内存,分配的所有字节都设为0

3、初始化东西的"类型东西指针"和"同步索引块"成员

4、挪用类型的实例结构器,通报在new挪用中指定的实参,大大都编译器都在结构器中自动生成代码来挪用基类结构器,每个类型的结构器都卖力初始化该类型界说的实例字段.最终挪用System.Object的结构器,该结构器什么都不做.

注:没有和new操纵符对应的delete操纵符,换言之,没有步伐显示释放为东西分配的内存.CLR给与了垃圾回收机制,能自动检测到一个东西不在被使用或者访谒,并自动释放东西的内存.

二、东西类型转换

1、根本常识

CLR最重要的特性之一就是类型安适.在运行时,CLR总能知道当前东西是什么类型,挪用GetType要领即可知道当前东西是什么类型,由于GetTpye长短虚要领,所以一个类型不能伪装成另一个类型.例如Employee类型不能重写GetType要领来返回一个SuperHero类型.

但是,日常开发中,经常需要将一种类型转换成另一种类型,CLR允许将东西转换成其实际类型或者它的任何基类型.每种编程语言都规定了开发人员具体如何进行这种转换.C#不要求任何特殊语法即可将东西转换成它的基类型,因为向基类型转换被认为是一种类型安适的转换.

东西转换成基类型的代码如下:

public class Program { static void Main(string[] args) { //因为CLR中,Object是所有类型的基类,所以不需要转型 Object obj = new Person(); } } internal class Person { }

然而将一个东西转换成其派生类型(也就是子类型)时,C#要求进行显式的转换,因为这种转换可能会在运行时掉败!

将东西转换成其派生类型(子类型),代码如下:

public class Program { static void Main(string[] args) { //因为CLR中,Object是所有类型的基类,所以不需要转型 Object obj = new Person(); //需要强制转换,因为Person派生自Object Person p = (Person)obj; } } internal class Person { }

注:进行强制转换的东西必需是接收类型的派生类型,如果不是,编译器会报System.InvalidCastException异常.

2、使用is和as来进行强制转换

(1)、is操纵符

C#中进行类型转换的另一种方法是使用is操纵符,is查抄东西是否兼容于指定类型,返回boolean值true或者false,注意:is操纵符永远不抛出异常,代码如下:

public class Program { static void Main(string[] args) { Object obj = new Object(); Console.WriteLine(obj is Person); Person p = new Person(); Console.WriteLine(p is Person); Console.ReadKey(); } } internal class Person { }

is操纵符凡是像下面这样使用:

if (stu is Person) { Person p = (Person)stu; }

在上述的代码中,CLR实际进行了两次的代码查抄,is操纵符首先核实stu是否兼容于Person类型,如果是,在if语句内部转型时,CLR再次核实stu是否引用一个Person类型,CLR的类型查抄增强了安适性,但无疑会对性能造成必然的影响,应为CLR首先必需去判断变量引用的实际类型,用每个基类型去查对指定的类型.

2、as操纵符

为了简化is操纵符的做法,同时供给is操纵符的性能,C#专门供给了as操纵符,as操纵符的事情方法与强制类型转换一样,只是它永远不抛出异常,如果东西不能转换,功效就是null.所以正确使用as操纵符的做法是查抄转型功效是否为null,如果直接使用这个功效可能会抛出System.NullReferenceException异常,代码如下:

public class Program { static void Main(string[] args) { Object obj = new Object(); Person p = obj as Person;//这个转换会掉败,但是p会被设为null,不抛出异常 string exceptionInfo = p.ToString();//这里访谒p会抛出异常 Console.WriteLine(exceptionInfo); Console.ReadKey(); } } internal class Person { }