this.value1
和c.value1
都可以为null或非null。所以共有4种组合进行测试。 value2
也可以为null或非null。
下面的if-then-else可以用更短的东西代替,比如使用三元运算符(如果那么使用? :
运算符) - 这对于这个特定情况是不好的做法,因为我们正在测试value1
和value2
的4种组合?
public override bool Equals(object obj)
{
bool value1_check = false;
bool value2_check = false;
var c = obj as ObjectType;
if (this.value1 != null)
value1_check = this.value1.Equals(c.value1);
else if ((this.value1 == null) && (c.value1 == null))
value1_check = true;
else if ((this.value1 == null) && (c.value1 != null))
value1_check = c.value1.Equals(this.value1);
if (this.value2 != null)
value2_check = this.value2.Equals(c.value2);
else if ((this.value2 == null) && (c.value2 == null))
value2_check = true;
else if ((this.value2 == null) && (c.value2 != null))
value2_check = c.value2.Equals(this.value2);
return (value1_check && value2_check);
}
答案 0 :(得分:7)
你可以拨打Object.Equals()
,已经完成了所有这些。
return Equals(this.Value1, c.Value1)
&& Equals(this.Value2, c.Value2);
答案 1 :(得分:4)
实际上,您可能需要?? Operator。
var lhs= this.value1 ?? c.value1 ?? null;
var rhs = c.value1 ?? this.value1 ?? null;
var value1Check = lhs == rhs
应该和你的一样,但几乎100%的可读性!
答案 2 :(得分:0)
下面的if-then-else可以被更短的东西替换,比如使用 三元运算符?
没有..
三元运算符等于If Condition Then Else Statement
你正在做的是IF Condition Else If Condition Then Else Statement
,这是完全不同的。
我实际上怀疑你提供的代码没有做你想做的事。
if (this.value1 != null)
value1_check = this.value1.Equals(c.value1);
else if ((this.value1 == null) && (c.value1 == null)) // Comment #1
value1_check = true;
else if ((this.value1 == null) && (c.value1 != null)) // Comment #2
value1_check = c.value1.Equals(this.value1);
评论#1 - 你明白this.value1必须等于null
因为if子句是假的吗?这意味着您只需检查c.value1
是否等于null
评论#2 - 再次...... this.value1
必须为null,没有其他值。同样,c.value1必须不等于null,因为前一个(* else *)if子句也是false。
这意味着您可以将代码简化为以下内容:
if (this.value1 != null)
{
value1_check = this.value1.Equals(c.value1);
}
else if ( c.value1 != null )
{
value1_check = c.value1.Equals(this.value1);
}
else // c.value1 is equal to null
{
value1_check = true;
}
当然,SLaks的解决方案是一个更好的主意。
答案 3 :(得分:0)
如果你还在想三元选项。
value1_check= this.value1!=null? this.value1.Equals(c.value1):(c.value1!=null?c.value.Equals(this.value):value1_check=true);