首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有理由使用Is和as吗?

问有理由使用Is和as吗?
EN

Stack Overflow用户
提问于 2015-06-23 21:17:01
回答 2查看 262关注 0票数 3

在考虑is与as在C#中时,您可以使用这两种方法来确认某个类型是否可以转换为另一种类型。

代码语言:javascript
复制
// 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?”他们不是同一个问题,也不是同一个答案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-23 21:21:39

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

代码语言:javascript
复制
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
}
票数 12
EN

Stack Overflow用户

发布于 2015-06-23 22:49:51

is操作符执行类型检查.as操作符执行类型检查和(如果可能的话)强制转换。

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

我能想到几种情况。首先,正如this answer已经指出的那样,不能按非空值类型进行强制转换。

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

假设如果您的强制转换成功,您将调用以下方法:

代码语言:javascript
复制
private void PerformManagerDuty(Manager m) 
{
    //Stuff happens
}

执行as强制转换之后,空检查需要比is多一行代码

代码语言:javascript
复制
//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强制转换:

代码语言:javascript
复制
if (e is Manager)
{ 
    PerformManagerDuty(e as Manager);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31013690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档