重複の可能性:
無限再帰を使用せずに「==」演算子のオーバーロードで null をチェックするにはどうすればよいですか?
これにはおそらく簡単な答えがあります...しかし、それは私を逃しているようです. 簡単な例を次に示します。
public class Person
{
public string SocialSecurityNumber;
public string FirstName;
public string LastName;
}
この特定のアプリケーションでは、社会保障番号が一致し、両方の名前が一致する場合、同じ「人」を参照していると言えます。
public override bool Equals(object Obj)
{
Person other = (Person)Obj;
return (this.SocialSecurityNumber == other.SocialSecurityNumber &&
this.FirstName == other.FirstName &&
this.LastName == other.LastName);
}
.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);
}
上品でダンディですね。
しかし、Person オブジェクトが の場合はどうなるnull
でしょうか?
あなたは書くことができません:
if (person == null)
{
//fail!
}
これにより == 演算子のオーバーライドが実行されるため、コードは次の場合に失敗します。
person.Equals()
null インスタンスでメソッドを呼び出すことはできないためです。
一方、== オーバーライド内でこの条件を明示的にチェックすることはできません。これは、無限再帰 (およびスタック オーバーフロー [ドットコム]) が発生するためです。
public static bool operator ==(Person person1, Person person2)
{
if (person1 == null)
{
//any code here never gets executed! We first die a slow painful death.
}
return person1.Equals(person2);
}
では、値の等価性のために == および != 演算子をオーバーライドし、それでも null オブジェクトを考慮するにはどうすればよいでしょうか?
答えが痛々しいほど単純ではないことを願っています。:-)