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

可能重复:
使用CLR中的’as’关键字进行转换
C#:“是”vs“as”

这段代码:

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

而这段代码:

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

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

我觉得它更好,因为它转换,你可以轻松检查..第二个是好的

更多关于此内容: 显式和隐式转换对象和显式转换中的’is’和’as’关键字

as和is之间的区别

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

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

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

第二个版本是首选。

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

有趣的是,在这种情况下,这两个版本产生相同的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 

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

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

如果您将这些对象预期为特定类型,则另一个问题。 然后只使用强制转换,如果类型不是您所期望的,则抛出exception。