这是一段代码
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而不在上面声明它?
谢谢!
答案 0 :(得分:3)
首先,答案是“是”,但这实际上并不是一个好兆头。在进行强制转换之后,如果您要多次使用强制转换的结果,那么您需要将它放入某种临时变量中是完全可取的。
在您提供的代码中,?
之前的整个表达式可以简化为ReferenceEquals(this, obj)
,因为reference-equals应该已经是空的安全。
此外,由于您正在执行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中的功能......
(BTW。代码最后一行是a / b / null-safe,这要归功于refequals taht将捕获2个空值的情况以及捕获所有单边空值的棘手第二行)