2015-06-23 35 views
2

当在C#中考虑isas时,您可以使用其中一种来确认某个类型是否可以转换为另一种类型。有没有理由使用is和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

你不使用被检查出来如何安全地投MSDN网站和AS https://msdn.microsoft.com/en-us/library/cc488006.aspx 'as运算更有效,因为如果可以成功投射,它实际上会返回投射值。 is运算符只返回一个布尔值。因此,当你只是想确定一个对象的类型,但不必实际施放它时,就可以使用它。' – MethodMan

+0

我明白如何使用这两个操作符来安全地施放类型。我更怀疑是否有令人信服的理由使用'is'而不是'as'。 – jdphenix

+0

Duplicate:http://stackoverflow.com/a/3786390/4705221 –

回答

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 
} 
+0

哦!那么,这清除了。谢谢。 :) – jdphenix

+0

@jdphenix如果你只是验证一个对象的类型,但不使用castes对象,它使你的程序更易于使用is运算符。 – Tobias

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); 
} 
相关问题