C# 是否有理由使用Is与as?

C# 是否有理由使用Is与as?,c#,type-conversion,C#,Type Conversion,当考虑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 `Man

当考虑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) { 

}
我了解两个操作员的工作方式以及如何使用它们。考虑<代码> < /COD>运算符检查类型两次,而<代码>作为< /COD>检查一次,并且它们对它们支持的转换类型都有相同的限制,是否有一个强制性的理由使用<代码>是< /代码>?
标记的副本询问两个运算符之间的区别。我的问题是特别问“理解两者的作用,为什么使用
is
?”,它们不是相同的问题,也没有相同的答案。

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

我能想到几个场景。首先,正如已经指出的,不能强制转换为不可为null的值类型

但是,您最初的示例虽然非常常见,但严重偏向于
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);
}

您还没有查看msdn站点,了解如何使用IS和AS安全地进行转换吗?
AS运算符效率更高,因为如果可以成功进行转换,它实际上会返回转换值。is运算符仅返回布尔值。因此,当您只想确定对象的类型而不必实际强制转换它时,可以使用它。
我了解如何使用这两个运算符来安全地强制转换类型。我更质疑是否有令人信服的理由使用
is
而不是
as
。重复:我认为
is
不会强制转换类型,它只会检查它
as
将其强制转换。我也了解这两个操作符的操作。我在问,如果
is
检查类型两次,而不是一次检查
as
,是否有理由使用
is
。哦!好吧,这就清楚了。谢谢。:)@jdpenix还可以使您的程序更具可读性,如果您只是验证对象的类型,而不是使用castes对象,那么可以使用is操作符。