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

时间:2016-08-23 23:32:16

标签: c# simplify

这是一段代码

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而不在上面声明它?

谢谢!

1 个答案:

答案 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个空值的情况以及捕获所有单边空值的棘手第二行)