类型安全是CLR中非常重要的一个特性,由于在.NET中所有的类型继承自System.Object,而Object对象又有GetType(),并且这个方法是非虚方法,我们是不能重写的。这样就充分的保证了对象的类型安全,也就能轻而易举的获取对象的精确类型,讨论is和as关键字的使用,首先要深刻的理解.NET的类型转换,is和as关键字的作用就是方便我们进行类型转换!
类型转换
将某一个类型转换成其他的类型是我们经常要做的事情,类型转换总的概括起来可以非常两种,就是隐式转换和显示转换。
l 隐式转换:将某一个对象转换成它的基类型,这种转换在C#中被认为是安全,所以不需要任何特殊的操作。称为隐式转换。
l 显示转换:相反,在将任何对象转换成它的派生类型时,C#要求使用特殊的语法,进行显示的转换,因为这种转换可能伴随有错误发生。
下面通过代码的形式讲解上面的两个概念,尽管有些过于简单了。
//Student类型隐含的继承自System.Object类型
public class Student
{
//.........
}
//显示转换,因为需要将子类的实例转换成它的父类
public class Teacher:Student
{
//.........
}
public class Program
{
static void
{
//隐式转换,因为new运算符返回的是Teacher类型的对象,
//并且Student是Teacher的子类!
Student student = new Teacher();
Teacher teacher = (Teacher)student;
}
}
在运行时,CLR会检查操作,以确保会将对象总是转换成它的实际类型,获取它的基类型。这正是.NET框架中的类型安全,也是.NET框架中非常重要的一部分,也是我们日常编程中需要经常使用的。
is和as操作符的使用
C#提供了is和as操作符进行类型转换,他们有个共同的特点:就是永远不会抛出异常!
l is:检查对象和给定的类型是否兼容,如果不兼容或者引用的对象为空,就返回false,如果类型兼容就返回true。
l as:也是检查对象和给定的类型是否兼容,和is不相同的是它在转换失败时,返回的是null!后面的代码中大家可以体会到,as的性能要比is操作符稍好一些!
下面还是通过代码的形式讲解上面的两个概念。
Teacher teacher = new Teacher();
//b1为true
System.Boolean b1 = (teacher is Student);
//b2为false
Student student = new Student();
System.Boolean b2 = (student is Teacher);
下面是is操作符的典型用法,
//判断student能够转换成Teacher类型的对象
if (student is Teacher)
{
Teacher teacher = (Teacher)student;
//能够进行转换,也就可以在if语句内部使用teacher!
teacher.ToString();
}
在上面的代码中大家可以看到,要想使用转后的实例,CLR实际上进行了两次检查操作!is操作符首先检查student所引用的对象是否和Teacher兼容,如果兼容,在if语句内部,CLR在进行转换时又会检查student是否是一个Teacher引用。
下面是as操作符的典型使用方法,大家可以看到,as操作符提供了更好的性能!
//CLR检查student所引用的对象是否和Teacher兼容!
Teacher teacher = student as Teacher;
if (teacher != null)
{
//如果转换后的对象不为空,则表示转换成功
//在if语句内部使用teacher
teacher.ToString();
}
注意在as操作符的转换中CLR只检查了一次,而is则检查了两次,性能获得了少许的提高!使用as操作符一定要进行非空类型检查,否则会抛出System.NullReferenceException异常!
千言万语归结为一句话,is用于判断,as用于转换!