【问题标题】:Do "x as X != null" and "x is X" always return the same result?“x as X != null”和“x is X”总是返回相同的结果吗?
【发布时间】:2013-12-19 16:37:48
【问题描述】:

这两个if语句会产生不同结果的情况吗?

if(x as X != null)
{
  // Do something
}

if(x is X)
{
  // Do something
}

编辑:澄清一下:我知道运算符(一般而言)和它们的含义有什么区别。问题是这两种情况是否会产生不同的结果。

【问题讨论】:

  • 如果X 是不可为空的结构,x as X 不起作用。
  • 抛开问题,使用 x 是 X,第一个只是愚蠢并创建额外的转换
  • @TimSchmelter is 如果左侧是 null,则返回 false。在这方面它们是相同的。
  • @CodesInChaos:我已经认出了它。 Here's 相关问题。感谢您指出了这一点。抱歉删除了我的评论,我后来才注意到你的评论。
  • @O.R. Mapper 用 if(x != null && x is X) 不是更好吗,这个对我来说更具可读性

标签: c# .net operators type-conversion comparison-operators


【解决方案1】:

这两个语句在功能上没有区别。通常as 版本用于避免双重类型测试,因为您可以执行以下操作

var local = x as X;
if (local != null) { 
  // Sweet I have local! 
}

对比

if (x is X) { 
  // This runs the type check yet again 
  var local = (X)x; 
}

如果您在类型测试后实际上并没有使用该值,那么只需使用is 版本

【讨论】:

    【解决方案2】:

    这两种if语句会产生不同结果的情况吗?

    首先,请注意as 的使用限制比is 的使用限制更多,因此x is X 可以编译,而(x as X) != null 可能无法编译。例如as要求指定的类型是引用类型或者可以为空的类型; is 也适用于不可为空的值类型。

    现在假设x is X(x as X) != null 都是有效的表达式。根据 C# 4.0 规范的第 7.10.11 节,“操作E as T 产生与E is T ? (T)(E) : (T)null 相同的结果”。如果我们将后一个表达式插入(x as X) != null,我们得到

        (x as X) != null
    ==  ((x is X) ? (X)x : null) != null  // by the definition of "as"
    ==  (x is X) ? ((X)x != null) : (null != null)  // distribute
    ==  (x is X) ? true : false  // because (x is X) implies (x != null)
    ==  x is X
    

    这证明如果x is X(x as X) != null 都是有效表达式,则它们是等价的。

    【讨论】:

    • 感谢您引用 C# 规范。看起来很有道理!
    【解决方案3】:

    如果x 是不可为空的类型(或不被限制为可空类型的泛型),则第一个选项将无法编译;第二个是唯一的选择。

    除此之外,它们是相同的。

    【讨论】:

    • null is ... 返回 false。即使在退化的情况下object o = null; Assert.IsFalse(o is object)
    【解决方案4】:

    在这种情况下:

    if(x as X != null)
    {
      // Do something
    }
    

    您首先尝试将 x 转换为类型 X,然后再与 null 进行比较(即转换是否成功)。

    在其他情况下:

    if(x is X)
    {
      // Do something
    }
    

    您只是在询问 x 是否属于 X 类型并且没有进行转换。

    【讨论】:

    • 在编译的情况下是等价的
    • 不回答 if 语句在功能上是否相同的问题...
    • @aKzenT 一个做演员,一个不做,怎么不回答问题?
    • 问题是:这两个if语句是否会产生不同的结果?
    • @aKzenT 但问题标题提出了其他问题。即使是您问题的第一行:以下 if 语句之间有区别吗?请编辑它以明确您是否如此具体。
    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 2016-09-18
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多