我需要在对象和NULL之间进行比较.当对象不是NULL时,我用一些数据填充它.
这是代码:
if (region != null)
{
....
}
Run Code Online (Sandbox Code Playgroud)
这是有效的,但是当某些时候循环和循环时,region对象是非null(我可以在调试模式下看到其中的数据).在调试时一步一步,它不会进入IF语句...当我使用以下表达式进行快速监视时:我看到(region == null)返回false,AND(区域!= null )也返回错误... 为什么以及如何?
更新
有人指出对象是==和!=重载:
public static bool operator ==(Region r1, Region r2)
{
if (object.ReferenceEquals(r1, null))
{
return false;
}
if (object.ReferenceEquals(r2, null))
{
return false;
}
return (r1.Cmr.CompareTo(r2.Cmr) == 0 && r1.Id == r2.Id);
}
public static bool operator !=(Region r1, Region r2)
{
if (object.ReferenceEquals(r1, null))
{
return false;
}
if (object.ReferenceEquals(r2, null))
{
return false;
}
return (r1.Cmr.CompareTo(r2.Cmr) != 0 || r1.Id != r2.Id);
}
Run Code Online (Sandbox Code Playgroud)
Mic*_*urr 29
是否为区域对象的类重载了==和/或!=运算符?
现在您已经发布了重载代码:
重载应该如下所示(代码取自Jon Skeet和Philip Rieck的帖子):
public static bool operator ==(Region r1, Region r2)
{
if (object.ReferenceEquals( r1, r2)) {
// handles if both are null as well as object identity
return true;
}
if ((object)r1 == null || (object)r2 == null)
{
return false;
}
return (r1.Cmr.CompareTo(r2.Cmr) == 0 && r1.Id == r2.Id);
}
public static bool operator !=(Region r1, Region r2)
{
return !(r1 == r2);
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 16
那些操作员过载被打破了.
首先,如果通过调用==并反转结果来实现!=,它会使生活变得更加容易.
其次,在无效检查之前==应该有:
if (object.ReferenceEquals(r1, r2))
{
return true;
}
Run Code Online (Sandbox Code Playgroud)
两个重载都不正确
public static bool operator ==(Region r1, Region r2)
{
if (object.ReferenceEquals(r1, null))
{
return false;
}
if (object.ReferenceEquals(r2, null))
{
return false;
}
return (r1.Cmr.CompareTo(r2.Cmr) == 0 && r1.Id == r2.Id);
}
Run Code Online (Sandbox Code Playgroud)
如果r1和r2为null,则第一个测试(object.ReferenceEquals(r1,null))将返回false,即使r2也为null.
尝试
//ifs expanded a bit for readability
public static bool operator ==(Region r1, Region r2)
{
if( (object)r1 == null && (object)r2 == null)
{
return true;
}
if( (object)r1 == null || (object)r2 == null)
{
return false;
}
//btw - a quick shortcut here is also object.ReferenceEquals(r1, r2)
return (r1.Cmr.CompareTo(r2.Cmr) == 0 && r1.Id == r2.Id);
}
Run Code Online (Sandbox Code Playgroud)