在考虑is与as在C#中时,您可以使用这两种方法来确认某个类型是否可以转换为另一种类型。
// 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?”他们不是同一个问题,也不是同一个答案。
发布于 2015-06-23 21:21:39
当目标类型是非空值类型时,必须使用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
}发布于 2015-06-23 22:49:51
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);
}https://stackoverflow.com/questions/31013690
复制相似问题