.NET如何避免在类型转换时的异常?

我们经常会面临一些类型转换的工作,其中有些是确定可以转换的(比如将一个子类类型转为父类类型),而有些则是尝试性的(比如将基类引用的对象转换成子类)。当执行常识性转换时,我们就应该做好捕捉异常的准备。

当一个不正确的类型转换发生时,会产生InvalidCastException异常,有时我们会用try-catch块做一些尝试性的类型转换,这样的代码没有任何错误,但是性能却相当糟糕,为什么呢?异常是一种耗费资源的机制,每当异常被抛出时,异常堆栈将会被建立,异常信息将被加载,而通常这些工作的成本相对较高,并且在尝试性类型转换时,这些信息都没有意义。.

So,在.NET中提供了另外一种语法来进行尝试性的类型转换,那就是关键字 is 和 as 所做的工作。

(1)is 只负责检查类型的兼容性,并返回结果:true 和 false。→ 进行类型判断

public static void Main(string[] args)
{
    object o = new object();
    // 执行类型兼容性检查
    if(o is ISample)
    {
        // 执行类型转换
        ISample sample = (ISample)o;
        sample.SampleShow();
    }

    Console.ReadKey();
}

(2)as 不仅负责检查兼容性还会进行类型转换,并返回结果,如果不兼容则返回 null 。→ 用于类型转换

public static void Main(string[] args)
{
    object o = new object();
    // 执行类型兼容性检查
    ISample sample = o as ISample;
    if(sample != null)
    {
        sample.SampleShow();
    }
    Console.ReadKey();
}

两者的共同之处都在于:不会抛出异常!

综上比较,as 较 is 在执行效率上会好一些,在实际开发中应该量才而用,在只进行类型判断的应用场景时,应该多使用 is 而不是 as。