作为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();
何时优先于另一个?在我使用的代码中,两者似乎都是随机使用的。
答案 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”然后转换更快。