在考虑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}}?”它们不是同一个问题,也没有相同的答案。
答案 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);
}