在没有声明的情况下在单个 return 行中使用对象

Using an object in a single return line without declaration

这是一段代码

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);
        }

是否可以在 return 行中使用 myObj 而无需在上面声明?

谢谢!

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

在您提供的代码中,? 之前的整个表达式可以简化为 ReferenceEquals(this, obj),因为引用等于已经可以安全地使用空值。

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

所以..整个代码减少到

return ReferenceEquals(this, obj);

..至少你现在的表达方式是这样的。

因此 "it-all-reduces-to-just-referenceequality" 我实际上认为你不希望那样。

我认为您想检查它们是否引用相等,然后快速 return 为真。然后只有当它们不引用相等时,您才会对内部属性执行分段比较。类似于:

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

..然后你可以把它压缩成一行,但这有什么意义呢?压缩它只会让它更难阅读,没有真正的性能提升,它只是将它全部打包到一行中,这甚至不是 "length of text" 方面的增益,因为你可以简单地 "fold" 中的函数大多数 IDE...

(顺便说一句。在代码中,最后一行是 a/b/null-safe 感谢 refequals taht 将捕获 2 个空值的情况和棘手的第二行,它捕获所有单边空值的情况)