gpt4 book ai didi

c# - 在没有声明的情况下在单个返回行中使用对象

转载 作者:太空宇宙 更新时间:2023-11-03 23:11:17 25 4
gpt4 key购买 nike

这是一段代码

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 而无需在上面声明?

谢谢!

最佳答案

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

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

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

所以..整个代码减少到

return ReferenceEquals(this, obj);

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

由于“它全部减少到仅引用相等”,我实际上认为您不希望那样。

我认为您想检查它们是否引用相等,然后快速返回 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 个 null 的情况,而棘手的第二行会捕获所有单边 null 的情况)

关于c# - 在没有声明的情况下在单个返回行中使用对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39112245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com