使用as运算符进行强制转换,即使在使用is运算符后验证C#中的类类型?

Coo*_*per 3 .net c# xna casting type-conversion

我理解通过使用as运算符来转换对象,通过显式转换,通常是更理想的,因为如果转换失败,引用变量将变为null而不是抛出异常.

但是,假设我在使用as运算符之前检查一个对象所在的类的类型,它是在List内部,就像这样,

DrawableGameComponent drawComponent;
foreach (component in Components)
{
     if (component is DrawableGameComponent)
     {
          drawComponent = component as DrawableGameComponent;

         // do something with drawComponent
     }
}
Run Code Online (Sandbox Code Playgroud)

使用as操作员是否通过is首先与操作员核实失去了它的好处?所以做下面的演员也同样好,因为我们is在尝试演员之前首先检查类类型?

if (component is DrawableGameComponent)
{
     ((DrawableGameComponent)componet).Visible = true;
}
Run Code Online (Sandbox Code Playgroud)

我只是想知道是否有一些我缺少的基础部分,或者这是否真的归结为品味使用的模式.后一种模式是否通过显式转换创建了垃圾?

提前致谢!

Yah*_*hia 11

更好(保存一个"演员" - 比较生成的IL):

DrawableGameComponent drawComponent;
foreach (component in Components)
{
     drawComponent = component as DrawableGameComponent;
     if (drawComponent != null)
     {


         // do something with drawComponent
     }
}
Run Code Online (Sandbox Code Playgroud)


And*_*ent 5

你使用as运算符检查类两次,虽然我怀疑除非在真正大规模的循环中,否则开销会很明显.

我更喜欢使用as和测试null并且还清理你的声明甚至更少的行:

foreach (component in Components)
{
     var drawComponent = component as DrawableGameComponent;
     if (drawComponent != null)
     {
          // do something with drawComponent
     }
}
Run Code Online (Sandbox Code Playgroud)