【问题标题】:Why does ReSharper recommend using "as" keyword instead of "is"? [duplicate]为什么 ReSharper 建议使用“as”关键字而不是“is”? [复制]
【发布时间】:2014-07-17 14:05:38
【问题描述】:

我使用Resharper 8 和我写的时候

if (sender is Button) 

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

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

有什么特别的原因吗?

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

【问题讨论】:

  • 我认为(我没有更准确的说法)这是因为您想稍后使用Buttonas 投射它并检查它是否可以投射。 is 只是检查它,无论如何你都必须投射它。

标签: c# casting operators


【解决方案1】:

as 可以说更好 if 结果表达式稍后使用; is 如果没有也一样好。例如

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 的回答将“is/(cast)”配对作为“不要做”,这引起了对共享和字段与属性访问的担忧。还讨论了性能和“is”与“as”的差异。

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

【讨论】:

  • 另外请注意,在 C# 6 中,我们将能够将 Button 的声明移动到 if 本身中,进一步改进它:if ((Button button = sender as Button) != null) {
【解决方案2】:

我认为这是因为as 关键字同时进行了类型检查和强制转换。因此,如果您以后使用发件人,则不必投射它

【讨论】:

  • 差不多就是这样——尽管是 JIT,甚至编译器,都可以优化这个……据我所知,这不是完成的,所以他的 AS 形式节省了一次演员表。
【解决方案3】:

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

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

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

上查看 Eric Liperts 博客

然而,在实践中,CLR 为我们提供了指令 isinst,它 具有讽刺意味的行为就像。因此我们有一个指令 很好地实现了 ass 的语义,我们可以从中构建一个 is的实施。简而言之,de jure is is is, and as is as is is, 法理上的现状就是现状, 但事实上 is is as and as isinst。

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

来自here

'as' 优于 'is

在is操作符的情况下,要进行类型转换,我们需要做两步:

  1. 使用 is 检查类型
  2. 如果为真,则进行类型转换

实际上这会影响性能,因为每次 CLR 将遍历继承层次结构,检查每个基类型 针对指定的类型。 为避免这种情况,请使用它会在一个 步骤。 我们应该使用 is 操作符来检查类型。

【讨论】:

    【解决方案4】:

    您没有发布所有代码。我猜在你的代码中,如果发送者是一个按钮,你将它转换为按钮并用它做一些事情。如果是这种情况,您就做了两次,一次在 if 中,一次在语句块中。 Resharper 告诉你做一次就可以了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-21
      • 1970-01-01
      • 2023-01-30
      相关资源
      最近更新 更多