这个问题有点主观。。。
“我倾向于假设像 Equals 这样的现成运算符会经历更多的处理操作。”
“您何时以及为什么会选择!而不是 Equals ,而且都超过 '传统' ==”
该Equals
方法作为对象实例的一部分用于检查该实例与另一个实例的相等性,而==
and!=
运算符是静态的,因此不受任何对象实例的约束。相反,它们就像一个特殊的静态方法,它接受两个参数(通常是相同的类型)并比较它们。
考虑以下示例:
public class CustomObject
{
int someValue, anotherValue;
public bool Equals(CustomObject obj)
{
return (this.someValue == obj.someValue && this.anotherValue == obj.anotherValue);
}
public static bool operator ==(CustomObject a, CustomObject b)
{
return a.Equals(b);
}
public static bool operator !=(CustomObject a, CustomObject b)
{
return !(a == b);
}
}
在此示例中,该Equals
方法用于生成将 中的值CustomObject
与相同类型的另一个实例进行比较的结果。==
CustomObject的运算符只需调用Equals
其中一个参数对象并针对另一个执行相等性检查。!=
运算符简单地否定==
并产生相反的结果。因此,==
并!=
没有太多的性能开销Equals
,因为无论如何它们都调用了该方法。
最佳实践:
如果条件本质上是布尔值,则无需使用Equals
,!=
或==
,但您应该使用!
来否定布尔条件。
例如:
if(IsPostBack) // this is good
if(IsPostBack == true) // this is unnecessary
if(!IsPostBack) // this is good
if(IsPostBack == false) // this is unnecessary
如果条件本质上不是布尔值,或者您正在比较两个布尔值,或者您正在比较枚举或其他值类型,则使用!=
or==
是可以接受的。
例如:
if(a == b) // this is good
if(a != b) // this is good
如果条件本质上不是布尔值,并且您正在比较的对象没有实现==
or!=
运算符,那么使用Equals
是可以接受的。请注意,禁止使用!=
和==
泛型,因为在编译时不知道在泛型对象类型参数表示的对象上实现!=
或实现。==
例如:
if(a.Equals(b)) //this is good
if(!a.Equals(b)) // this is good
if(a.Equals(b) == true) // this is unnecessary