1

Possible Duplicate:
Casting vs using the 'as' keyword in the CLR
C#: “is” vs “as”

This code:

    if (sheet.Models.Data is GroupDataModel)
    {
        GroupDataModel gdm = (GroupDataModel)sheet.Models.Data;

and this code:

    GroupDataModel gdm = sheet.Models.Data as GroupDataModel;
    if (gdm != null)
    {

Do you recommend any of the two styles above over the other one?

4

5 回答 5

5

后者是 FxCop 提倡的,因为演员只需要执行一次 (the as)

于 2012-08-30T19:33:59.880 回答
3

我认为它更好,因为它可以转换以及您可以轻松检查..第二个很好

有关此的更多信息:对象的显式和隐式转换以及“is”和“as”关键字在显式转换中的作用

as 和 is 的区别

  • as 运算符将一种类型转换为另一种类型,如果转换失败则返回 Null。如果它是可转换的,则无需再次转换。

  • is 运算符检查天气一个对象是否可以转换为另一种类型,如果不是则返回 false。因此,如果它可转换,则需要将对象转换为基本类型。

于 2012-08-30T19:33:49.887 回答
2

有趣的是,这两个版本在这种情况下产生了相同的 IL:

代码

void Main() {
    Class1 inst1 = new Class1();
    ((inst1 as Class1) != null).Dump();

    Class1 inst2 = new Class1();
    (inst2 is Class1).Dump();
}

class Class1 { }

伊利诺伊

IL_0001:  newobj      UserQuery+Class1..ctor
IL_0006:  stloc.0     
IL_0007:  ldloc.0     
IL_0008:  ldnull      
IL_0009:  ceq         
IL_000B:  ldc.i4.0    
IL_000C:  ceq         
IL_000E:  call        LINQPad.Extensions.Dump
IL_0013:  pop         
IL_0014:  newobj      UserQuery+Class1..ctor
IL_0019:  stloc.1     
IL_001A:  ldloc.1     
IL_001B:  ldnull      
IL_001C:  ceq         
IL_001E:  ldc.i4.0    
IL_001F:  ceq         
IL_0021:  call        LINQPad.Extensions.Dump

Class1..ctor:
IL_0000:  ldarg.0     
IL_0001:  call        System.Object..ctor
IL_0006:  ret   
于 2012-08-30T19:48:22.907 回答
1

如果以后要使用类型化的对象,请使用“ as”。

如果您不打算将对象与类型本身一起使用,请使用“ is”。

如果您期望这些对象属于该特定类型,那将是另一个问题。然后只需使用 cast 并让它抛出异常,如果类型不是你所期望的。

于 2012-08-30T20:27:07.487 回答
1

首选第二个版本。

第二个版本只需要一次型式测试。如果测试成功,第一个需要两次类型测试(首先is是演员,然后是演员)。

于 2012-08-30T19:34:18.073 回答