Ich versuche operator==
in einer meiner Klassen zu implementieren. Nach dem Buch Microsoft Visual C# Schritt für Schritt soll ich es wie so schreiben:Wie vermeide ich NullReferenceException bei der Implementierung von Operator ==
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);
}
}
}
Dieses Programm NullReferenceException
auf der vierten Debug-Zeile wirft, weil lhs
auf der Linie lhs.Equals(rhs)
null ist. Ich kann if (lhs != null)
in operator==
nicht setzen, weil das endlose Rekursion verursacht (wie das Buch warnt). Also, um eine Ausnahme zu vermeiden, wenn eine Null-Instanz meiner Klasse zu vergleichen, änderte ich die Umsetzung dazu:
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;
}
}
(Ich bin neu in C# aus einem Objective C Hintergrund kommen, wo [lhs method:argument]
glücklich null zurück, wenn lhs
ist null, also würde eine Ausnahme wie diese nie passieren.)
Ist diese Ausnahme-basierte Implementierung idiomatisch C# korrigieren?