我正在尝试在我的一个类中实现 operator==
。根据Microsoft Visual C# Step by Step这本书,我应该这样写:
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
,因为 lhs
在 lhs.Equals(rhs)
行中为 null。我不能将 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# 的新手,来自 Objective C 背景,其中 [lhs method:argument]
如果 lhs
为 nil,则愉快地返回 nil,因此像这样的异常会永远不会发生。)
这种基于异常的实现在 C# 中是否符合惯用语?
最佳答案
我会避免为您的情况使用 try-catch block 。您只需将您的运营商更改为:
public static bool operator ==(EqualTestClass lhs, EqualTestClass rhs)
{
return object.Equals(lhs, rhs);
}
public static bool operator !=(EqualTestClass lhs, EqualTestClass rhs)
{
return !object.Equals(lhs, rhs);
}
这将为您进行空值检查,同时仍然调用您重写的 Equals()
方法。根据 System.Object.Equals()
的源代码:
public static bool Equals(Object objA, Object objB)
{
if (objA==objB) {
return true;
}
if (objA==null || objB==null) {
return false;
}
return objA.Equals(objB);
}
看起来这可以解决您的问题。
关于c# - 实现 operator== 时如何避免 NullReferenceException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39905809/