对此可能有一个简单的答案......但它似乎在逃避我.这是一个简化的例子:
public class Person
{
public string SocialSecurityNumber;
public string FirstName;
public string LastName;
}
Run Code Online (Sandbox Code Playgroud)
让我们说,对于这个特定的应用程序,如果社会安全号码匹配,并且两个名称都匹配,那么我们指的是同一个"人"是有效的.
public override bool Equals(object Obj)
{
Person other = (Person)Obj;
return (this.SocialSecurityNumber == other.SocialSecurityNumber &&
this.FirstName == other.FirstName &&
this.LastName == other.LastName);
}
Run Code Online (Sandbox Code Playgroud)
为了保持一致,我们还为团队中不使用该.Equals方法的开发人员覆盖==和!=运算符.
public static bool operator !=(Person person1, Person person2)
{
return ! person1.Equals(person2);
}
public static bool operator ==(Person person1, Person person2)
{
return person1.Equals(person2);
}
Run Code Online (Sandbox Code Playgroud)
好又花花公子,对吧?
但是,当Person对象发生时会发生什么null?
你不能写:
if (person == null)
{
//fail! …Run Code Online (Sandbox Code Playgroud) 以下将导致==运算符重载方法的无限递归
Foo foo1 = null;
Foo foo2 = new Foo();
Assert.IsFalse(foo1 == foo2);
public static bool operator ==(Foo foo1, Foo foo2) {
if (foo1 == null) return foo2 == null;
return foo1.Equals(foo2);
}
Run Code Online (Sandbox Code Playgroud)
我如何检查空值?
我对这三个的理解是:
.Equals()测试数据平等(缺乏更好的描述)..Equals()可以为同一对象的不同实例返回True,这是最常被覆盖的方法.
.ReferenceEquals() 测试两个对象是否是同一个实例,并且不能被覆盖.
==ReferenceEquals()默认情况下与此相同,但可以覆盖此项.
但C#站说:
在对象类中,
Equals和ReferenceEquals方法在语义上是等效的,除了ReferenceEquals它只在对象实例上有效.该ReferenceEquals方法是静态的.
现在我没理解.任何人都可以对此有所了解吗?