是否有使用 is 和 as 的理由?

Is there ever a reason to use is versus as?

在考虑 C# 中的 isas 时,您可以使用其中之一来确认一种类型是否可以转换为另一种类型。

// 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

标记重复的是问这两个运算符有什么区别。我的问题是专门问"Understanding what both do, why use is?"他们不是同一个问题,他们的答案也不一样

当目标类型是不可为 null 的值类型时,您必须使用 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
}

is 运算符执行类型检查。 as 运算符执行类型检查和(如果可能)强制转换。

is there ever a compelling reason to use is?

我能想到几个场景。首先,正如 已经指出的那样,您不能转换为不可空值类型。

但是您的原始示例虽然非常常见,但严重偏向 as。这完全取决于您在转换 and/or 类型检查后要做什么。

假设您将在转换成功时调用以下方法:

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);
}