何时使用'as'以及何时在C#中使用'is'

时间:2011-05-27 11:33:45

标签: c# .net c#-2.0

  

可能重复:   casting vs using the 'as' keyword in the CLR

作为C#的新手,我想知道这是否有任何重要的区别:

object o = SomeFunction();
if (o is MyClass)
{
    MyClass myObject = (MyClass) o;
    myObject.MyFunction();
}

和此:

object o = SomeFunction();
MyClass myObject = o as MyClass;
if (myObject != null)
    myObject.MyFunction();

何时优先于另一个?在我使用的代码中,两者似乎都是随机使用的。

6 个答案:

答案 0 :(得分:0)

第二个示例不适用于值类型,因为如果转换失败,as运算符将返回null。在C#中,'is'运算符返回true如果对象的类型与您提供的类型匹配,则返回false。

答案 1 :(得分:0)

is运算符检查对象是否与给定类型兼容,并且评估结果为布尔值:true或false。 is运算符永远不会抛出异常。

as运算符的工作方式与cast类似,但as运算符永远不会抛出异常。相反,如果无法转换对象,则结果为null。如果失败,常规强制转换'(Type)'将抛出异常。请注意,使用'as'转换null会产生null。因此,'as'-cast的null结果并不总是意味着一个对象不是给定的类型,它可能是实例为null。

答案 2 :(得分:0)

根据你的代码,如果'o'需要用于某些操作,那么“as”更好。如果'o'仅用于检查类型,那么'是'更好。

答案 3 :(得分:0)

您应该使用提供最易读代码的内容。所以这真的取决于你在做什么。

恕我直言,is关键字是邪恶的。它会邀请您打破Liskov substitution principle

答案 4 :(得分:0)

我认为两个代码都做同样的事情。如果我不确定要处理的对象(例如,动态加载应该实现接口的类),我可能会使用第一个。但是如果我非常肯定会使用第二个(例如,在页面上找到一个控件)。

答案 5 :(得分:-2)

使用“as”并检查null比使用“is”然后转换更快。