哪个代码更好:使用“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。