可能重复:
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)
{
你推荐上面两种风格中的任何一种吗?
答案 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
”。
如果您将这些对象预测为该特定类型,则另一个问题。然后只使用强制转换,如果类型不符合您的预期,则抛出异常。