C#objectisnotnull,but(myObject!=null)stillreturnsfalse我需要在object和NULL之间进行比较。当对象不为NULL时,我用一些数据填充它。这是代码:if(region!=null){....}这有效,但在循环和循环的某个时刻,区域对象是非空的(我可以在调试模式下看到其中的数据)。在调试时单步执行,它不会进入IF语句......当我使用以下表达式快速观察时:我看到(region==null)返回false,AND(region!=null)也返回一个错误...为什么以及如何?更新有人指出对象是==和!=重载:publicstaticbooloperator==(Regionr1,Regionr2){if(object.ReferenceEquals(r1,null)){returnfalse;}if(object.ReferenceEquals(r2,null)){返回false;}返回(r1.Cmr.CompareTo(r2.Cmr)==0&&r1.Id==r2.Id);}publicstaticbooloperator!=(Regionr1,Regionr2){if(object.ReferenceEquals(r1,null)){returnfalse;}if(object.ReferenceEquals(r2,null)){返回false;}返回(r1.Cmr.CompareTo(r2.Cmr)!=0||r1.Id!=r2.Id);}是否==和/或!区域对象=运算符的类重载了吗?现在您已经发布了重载的代码:重载应该如下所示(代码摘自JonSkeet和PhilipRieck的帖子):publicstaticbooloperator==(Regionr1,Regionr2){if(object.ReferenceEquals(r1,r2)){//如果两者都为null以及对象身份则处理returntrue;}if((object)r1==null||(object)r2==null){returnfalse;}返回(r1.Cmr.CompareTo(r2.Cmr)==0&&r1.Id==r2.Id);}publicstaticbooloperator!=(Regionr1,Regionr2){return!(r1==r2);如果通过调用==并反转结果来实现,这些运算符重载将首先被破坏!=,它会让生活更轻松。其次,在无效检查==之前应该有:if(object.ReferenceEquals(r1,r2)){returntrue;}两种重载都不正确publicstaticbooloperator==(Regionr1,Regionr2){if(object.ReferenceEquals(r1,null)){}if(object.ReferenceEquals(r2,null)){返回false;}返回(r1.Cmr.CompareTo(r2.Cmr)==0&&r1.Id==r2.Id);如果r1和r2为空,第一个测试(object.ReferenceEquals(r1,null))将返回false,即使r2也为空。尝试//ifs扩展一点以提高可读性publicstaticbooloperator==(Regionr1,Regionr2){if((object)r1==null&&(object)r2==null){returntrue;}if((object)r1==null||(object)r2==null){returnfalse;}//顺便说一句-这里的快捷方式也是object.ReferenceEquals(r1,r2)return(r1.Cmr.CompareTo(r2.Cmr)==0&&r1.Id==r2.Id);当多个线程使用相同的数据时,有时会发生这种情况。如果是这种情况,您可以使用锁来防止它们相互混淆。对于“T”类型的相等比较,这些方法被重载:intGetHashCode()//OverridesObject.GetHashCodeboolEquals(objectother)//OverridesObject.Equals;将对应于IEquatable,如果存在这样的接口boolEquals(Tother)//ImplementsIEquatable;对每个要与静态布尔运算符进行比较的T执行此操作==(Tx,Ty)staticbooloperator!=(Tx,Ty)IEquatable接口方法Equals(Tother)。如果您要与另一种类型(T2)进行比较,IEquatable会实现IEquatable,并将该类型的字段比较代码放入Equals(T2其他)中。所有重载方法和运算符都应将相等比较任务转发给主要的类型安全Equals(Tother)实例方法,以维护干净的依赖层次结构,并在每个级别引入更严格的保证,以消除冗余冗余和不必要的复杂性。boolEquals(objectother){if(otherisT)//为每个IEquatable、IEquatable等复制这个。你可以实现returnEquals((T)other));//转发到IEquatable实现returnfalse;//other为null或无法与此实例进行比较;因此不等于}boolEquals(Tother){if((object)other==null)//转换为对象进行引用相等性比较,或者使用object.ReferenceEqualsreturnfalse;//if((object)other==this)//可能的性能提升,仅当对象实例经常与自身进行比较时!否则它只是一个额外的无用检查//returntrue;返回field1.Equals(other.field1)&&field2.Equals(other.field2);//比较类型字段以确定是否相等}publicstaticbooloperator==(Tx,Ty){if((object)x!=null)//转换为对象以进行引用相等性比较,或使用object.ReferenceEqualsreturnx.等于(y);//在非空实例x上转发到类型安全的Equalsif((object)y!=null)返回false;//x为空,y不为空returntrue;//两者都为空}publicstaticbooloperator!=(Tx,Ty){if((object)x!=null)return!x.Equals(y);//在非空实例x上转发到类型安全的Equalsif((object)y!=null)returntrue;//x为空,y不为空returnfalse;//bothnull}讨论:前面的实现将特定于类型(即字段相等)的比较集中到该类型的IEquatable实现的末尾==和!=运算符具有并行但相反的实现。我更愿意将一个引用到另一个,以便对依赖项进行额外的方法调用。如果!=运算符只是调用==运算符,而不是提供具有相同性能的运算符,那么您还可以使用!(obj1==obj2)并避免额外的方法调用。equals运算符和IEquatable实现中省略了自我比较,因为它可能会引入1.在某些情况下不必要的开销,和/或2.基于实例与自身比较的频率与其他情况相比的不一致性能。另一种我不喜欢但应该提及的方法是反转此设置,将特定于类型的相等代码集中在相等运算符中,并使Equals方法依赖于它。ReferenceEquals(obj1,obj2)的快捷方式随后可用于检查引用相等性和null相等性,正如Philip在之前的帖子中提到的那样,但这个想法具有误导性。看起来你只是用一块石头打死两只鸟,但实际上你在创造更多的工作——在你确定对象既不为空之后,你还将继续检查每个实例是否为空也不是同一个实例。在我的实现中,您只需检查一次任何单个实例是否为null。当调用Equals实例方法时,被比较的第一个对象已经被排除为空,所以剩下要做的就是检查另一个是否为空。所以,最多比较两次之后,无论我们使用哪种方法(Equals(object),Equals(T),==,!=),我们都直接跳转到现场检查。另外,正如我所提到的,如果您大部分时间都在与自己进行比较,则可以在进入字段比较之前在Equals方法中添加该检查。在最后添加它的目的是您仍然可以维护流/依赖层次结构,而无需在每个级别引入冗余/无用的检查。那么这些检查是不正确的:publicstaticbooloperator!=(Regionr1,Regionr2){if(object.ReferenceEquals(r1,null)){returnfalse;}if(object.ReferenceEquals(r2,null)){返回false;}...还有一种可能,您需要单击您正在观看的参数旁边的刷新图标。VS试图在不评估每个语句/参数的情况下跟上性能。在你开始改变不相关的地方之前先确定一下。以上就是C#学习教程:C#objectisnotnull,but(myObject!=null)stillreturnsfalse所有内容分享,如果对大家有用还需要详细了解C#学习教程,希望大家点赞更多关注——boolcomp;如果(object.IsNullOrEmpty(r1)){comp=false;}if(object.IsNullOrEmpty(r2)){comp=false;}返回补偿;本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
