【问题标题】:Using an object in a single return line without declaration在没有声明的情况下在单个返回行中使用对象
【发布时间】:2016-08-23 23:32:15
【问题描述】:

这是一段代码

public override bool Equals(object obj)
        {
            var myObj= obj as MyClass;
            return obj == null || myObj== null || !ReferenceEquals(this, obj) ? false :
                (this.V1== myObj.V1) && (this.V2== myObj.V2) && (this.V3== myObj.V3);
        }

是否可以在没有在上面声明的情况下在返回行中使用 myObj?

谢谢!

【问题讨论】:

  • 是的,return obj == null || obj as MyClass == null || !ReferenceEquals(this, obj) ? false : true;
  • 你甚至可以这样做:return obj as MyClass != null && ReferenceEquals(this, obj);.
  • 哦是的..我有点笨,我已经隐藏了真正导致问题的代码部分,让我编辑......
  • 确实如此! :) 它变得好多了!谢谢你的提示。

标签: c# simplify


【解决方案1】:

首先答案是“是”,但这实际上不是一个好兆头。进行强制转换后,如果您要多次使用强制转换的结果,您需要将其放入某种临时变量中,这是完全可以预料的事情。

在您提供的代码中,? 之前的整个表达式可以简化为 ReferenceEquals(this, obj),因为使用 null 时,reference-equals 应该是安全的。

此外,由于您正在执行引用等于,并在失败时返回 false,因此您不需要任何其他检查。 : 的右边是多余的。它仅在 ref-equals 返回 true 时激活,但这种情况意味着被比较的两个变量实际上是同一个对象 - 所以所有其他比较无论如何都会返回 true - 所以不需要它们。

所以..整个代码简化为

return ReferenceEquals(this, obj);

..至少你当前的表达方式是这样的。

由于“一切都减少到只是引用平等”,我实际上认为您不希望这样。

我认为您想检查它们是否 ref-equal,然后快速返回 true。然后,只有当它们不相等时,您才会对内部属性进行分段比较。比如:

if(refequals(a,b)) return true;
if((a==null) != (b==null)) return false;
return a.prop1==b.prop1 && a.prop2 == b.prop2 && ... ;

.. 然后你可以把它压缩成单线,但有什么意义呢?压缩它只会使它更难阅读,并没有真正的性能提升,它只是将它们全部打包到一行中,这在“文本长度”方面甚至不是增益,因为您可以简单地“折叠”大多数 IDE 中的函数...

(顺便说一句,代码最后一行是 a/b/null 安全的,这要归功于 refequals taht 将捕获 2 个空值的情况以及捕获所有单面空值情况的棘手的第二行)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多