哪个代码更好:使用“as”或“is”?

时间:2012-08-30 19:31:57

标签: c# syntax casting operators

  

可能重复:
  Casting vs using the 'as' keyword in the CLR
  C#: “is” vs “as”

此代码:

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

和这段代码:

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

你推荐上面两种风格中的任何一种吗?

5 个答案:

答案 0 :(得分:5)

后者由FxCop提倡,因为演员只需执行一次(as

答案 1 :(得分:3)

我认为最好去,因为它转换以及你可以轻松检查..第二个是好的

有关此内容的更多信息:Explicit and Implicit Casting of object and Role of 'is' and 'as' keyword in Explicit casting

as和is之间的区别

  • 作为运算符从一种类型转换为另一种类型,并在转换时返回Null 失败。如果它是敞篷车,则无需再次转换。

  • 是操作员检查天气一个对象是否可以在另一种类型中转换,如果没有则返回false。因此,如果可转换,则需要将对象转换为基本类型。

答案 2 :(得分:1)

首选版本。

第二个版本只需要一个类型测试。如果测试成功,第一个需要两个类型测试(第一个用于is,然后再用于强制转换)。

答案 3 :(得分:1)

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

<强>代码

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

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

class Class1 { }

<强> IL

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   

答案 4 :(得分:1)

如果您打算在之后使用键入的对象,请使用“as”。

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

如果您将这些对象预测为该特定类型,则另一个问题。然后只使用强制转换,如果类型不符合您的预期,则抛出异常。