是否有理由使用is as?

时间:2015-06-23 21:17:01

标签: c# type-conversion

在考虑C#中的as// using is Employee e = new Manager(); if (e is Manager) { var m = (Manager) e; // m is now type `Manager` } // using as Employee e = new Manager(); Manager m = e as Manager; // m is now type `Manager` if (m != null) { } 时,您可以使用其中一种来确认某种类型是否可转换为其他类型。

is

我理解两个运营商的工作方式以及如何使用它们。考虑as运算符在is检查一次时检查类型两次,并且它们对它们支持的转换类型有相同的限制,是否有令人信服的理由使用is

标记的副本是询问两个运算符之间的区别。我的问题是具体问“理解两者的作用,为什么要使用{{1}}?”它们不是同一个问题,也没有相同的答案。

2 个答案:

答案 0 :(得分:12)

当目标类型为非可空值类型时,您必须使用is而不是as

object obj = 0;
int i = obj as int; // compilation error because int can't represent null

if (obj is int)
{
    int j = (int)obj; // works
}

答案 1 :(得分:3)

is运算符执行类型检查。 as运算符执行类型检查和(如果可能)演员表。

  

是否有令人信服的理由使用is

我可以想到几个场景。首先,正如this answer已经指出的那样,你不能抛弃不可为空的值类型。

但是你的原始例子虽然极为常见,却严重偏向于as。这完全取决于你的演员表和/或类型检查后你要做什么。

假设你的演员成功,你会说你将调用以下方法:

private void PerformManagerDuty(Manager m) 
{
    //Stuff happens
}

执行as强制转换,然后空检查需要额外的一行代码而不是is

//as casting with null check
var m = e as Manager; 
if (m != null)
{
    PerformManagerDuty(m);
}

//is check before cast
if (e is Manager)
{ 
    PerformManagerDuty((Manager)e);
}

此外,如果您愿意,在使用is执行类型检查后,您可以执行as演员而不会造成性能损失:

if (e is Manager)
{ 
    PerformManagerDuty(e as Manager);
}