operator==
をクラスの1つに実装しようとしています。ステップの著書のMicrosoft Visual C#ステップによると、私はそうのようにそれを書く必要があります:lhs
はラインlhs.Equals(rhs)
にnullであるため、operator ==を実装するときにNullReferenceExceptionを避けるには
using System;
using System.Diagnostics;
namespace EqualTest2
{
public class EqualTestClass
{
public double _x1;
public EqualTestClass(double x1)
{
_x1 = x1;
}
public override bool Equals(object other)
{
if (other is EqualTestClass)
{
return (Math.Abs(_x1 - ((EqualTestClass)other)._x1) < 1e-6);
}
return false;
}
public override int GetHashCode()
{
return base.GetHashCode();
}
public static bool operator ==(EqualTestClass lhs, EqualTestClass rhs)
{
return lhs.Equals(rhs);
}
public static bool operator !=(EqualTestClass lhs, EqualTestClass rhs)
{
return !lhs.Equals(rhs);
}
}
class Program
{
static void Main(string[] args)
{
EqualTestClass test1 = new EqualTestClass(1.0);
EqualTestClass test2 = new EqualTestClass(1.0);
EqualTestClass test3 = new EqualTestClass(2.0);
EqualTestClass test4 = null;
Debug.WriteLine("1: {0}", test1 == test2);
Debug.WriteLine("2: {0}", test1 == test3);
Debug.WriteLine("3: {0}", test1 == test4);
Debug.WriteLine("4: {0}", test4 == test1);
}
}
}
このプログラムは、第四デバッグライン上NullReferenceException
をスローします。私はif (lhs != null)
をoperator==
に入れることができないため、無限再帰が発生する(ブックの警告として)。
public static bool operator ==(EqualTestClass lhs, EqualTestClass rhs)
{
try
{
return lhs.Equals(rhs);
}
catch (NullReferenceException)
{
return false;
}
}
public static bool operator !=(EqualTestClass lhs, EqualTestClass rhs)
{
try
{
return !lhs.Equals(rhs);
}
catch (NullReferenceException)
{
return false;
}
}
は(私はC#は喜んlhs
場合はnilを返します[lhs method:argument]
のObjective Cの背景から来るに新たなんだ。だから私のクラスのヌルインスタンスを比較するときに例外を避けるために、私はこれに実装を変更しましたこのような例外は発生しません)。
この例外ベースの実装は、イディオム的に正しいですか?