为什么ReSharper建议使用" as"关键字而不是"是"?

时间:2014-05-28 11:14:27

标签: c# casting operators

我使用Resharper 8,当我写

if (sender is Button) 

Resharper回复使用as关键字并将其更改为:

Button button = sender as Button;
if (button != null)

有什么特别的原因吗?

正在使用as真的比is更好吗?或者在这种情况下as更好?

4 个答案:

答案 0 :(得分:4)

as可以说是更好如果以后使用了结果表达式; is即使没有,也是如此。 E.g。

if (sender is Button) {
    Button button = (Button)sender;  // just use `as`, as suggested
    button.Push();

(我认为ReSharper只是在的情况下给出了一个警告/暗示可以消除重复的演员表,例如这个......)

话虽如此,我使用结构

Button button;
if ((button = sender as Button) != null) {
    button.Push();

确保变量在条件中初始化(并且仅在条件中开始) - 这将as的应用推迟到适当的条件表达式,并允许C#/ ReSharper检测一些不正确的[未初始化]变量用例


另见:

Casting vs using the 'as' keyword in the CLR - Jon的回答是“/(强制转换)”配对作为“不做”引起对共享和字段与属性访问的关注。表现和'''与'''差异也在讨论中。

还有一个重复的Which code is better: using "as" or "is"?,其中有一些更好的相关链接。

答案 1 :(得分:3)

我认为这是因为as关键字同时执行,同时键入check和cast。因此,如果您以后使用发件人,则不必进行投射

答案 2 :(得分:3)

" as"运算符用于执行兼容类型之间的转换。而"是" operator用于检查对象的运行时类型是否与给定类型兼容。

所以我认为当as运算符尝试将对象强制转换为特定类型时,这是一个更好的选择,如果失败则返回null。

您还可以在 Is is as or is as is?

上查看 Eric Liperts 博客
  

然而,在实践中,CLR为我们提供了指令isinst,其中   具有讽刺意味的是。因此我们有一个指令   实现了很好的语义,我们可以从中构建一个   实施是。简而言之,法律上是,并且按原样,   但事实上就是和isinst一样。

What's the difference between "as" and "cast" operators?

来自here

  

' as'结束

     

对于is运算符,要键入强制转换,我们需要执行两个步骤:

     
      
  1. 使用
  2. 检查类型   
  3. 如果是,则输入
  4.         

    实际上这会影响每次的性能   CLR将遍历继承层次结构,检查每个基类型   针对指定的类型。 要避免这种情况,请使用,因为它将在一个中执行   步骤。只有在检查类型时才应使用is运算符。

答案 3 :(得分:0)

您没有发布所有代码。我想在你的代码中,如果发送者是一个按钮,你将它转换为按钮并用它做一些事情。如果是这种情况,那么你在两次中完成了这项工作,一次是在语句块中的if和once中。 Resharper告诉你要做一次并完成它。