C# 我是否已更改被重写的“==”运算符的意图?
以下重载的C# 我是否已更改被重写的“==”运算符的意图?,c#,null,operator-overloading,C#,Null,Operator Overloading,以下重载的==运算符是中的日历类的一部分 当我尝试访问SouthAfricanCalendar属性时,我收到一个System.NullReferenceException:对象引用未设置为对象的实例。这促使我深入研究源代码 public SouthAfrica SouthAfricanCalender { get { if (_calender == null) { _calender = new SouthAfrica();
==
运算符是中的日历类的一部分
当我尝试访问SouthAfricanCalendar
属性时,我收到一个System.NullReferenceException:对象引用未设置为对象的实例。
这促使我深入研究源代码
public SouthAfrica SouthAfricanCalender
{
get
{
if (_calender == null)
{
_calender = new SouthAfrica();
}
return _calender;
}
set
{
if (_calender == null)
{
_calender = value;
}
}
}
SouthAfrica _calender;
根据答案,我已对过载进行了如下处理
我的问题是,我的修正案是否改变了原法典的意图
编辑:有没有关于如何进一步清理的建议?没有
它仍然会检查是否相等。否。您可以确保这两个对象都是对象,并相应地在它们不是的位置做出响应(假设ReferenceEquals可以处理双空)。然后,您只需执行相同的检查。整个.empty()是完全不必要的,顺便说一下,您已经知道它不是null,只需返回名称比较。如果((对象)c1==null | |(对象)c2==null)返回false,您不需要代码>不需要对对象进行强制转换。仅当c1==null | |(c2==null)返回false时代码>@aliostad-谢谢你的建议…@aliostad:不是真的!如果不强制转换到对象
,您可能会得到无限循环的=
调用,导致StackOverflowException
。在更新的==方法中,在前两个if语句之后,您已经确定c1和c2都是非空的。您可以将return语句更改为return c1.name()==c2.name()
@david-我也这么想-只需要确保name()
函数中没有奇怪的事情发生。
public SouthAfrica SouthAfricanCalender
{
get
{
if (_calender == null)
{
_calender = new SouthAfrica();
}
return _calender;
}
set
{
if (_calender == null)
{
_calender = value;
}
}
}
SouthAfrica _calender;
public static bool operator ==(Calendar c1, Calendar c2)
{
if ( object.ReferenceEquals(c1,c2)) return true;
if ((object)c1 == null || (object)c2 == null) return false;
return (c1.empty() && c2.empty())
|| (!c1.empty() && !c2.empty() && c1.name() == c2.name());
}