当前位置: 首页 > 编程语言 > C#

C#相等性检查分享

时间:2023-04-10 23:48:48 C#

C#相等性检查你用什么方法为你创建的结构体和类编写相等性检查?1)“完整”相等性检查是否需要大量样板代码(如覆盖Equals、覆盖GetHashCode、genericsEquals、operator==、operator!=)?2)您是否明确指定您的类对IEquatable接口进行建模?3)我是否正确理解没有实际的方法来自动应用等于覆盖,当我调用类似a==b的东西时,我总是必须实现等于和运算符==成员?没错,这是很多样板代码,您需要单独实现所有内容。我建议:这是一个示例实现:usingSystem;publicsealedclassFoo:IEquatable{privatereadonlystringname;publicstringName{get{返回名称;}}私有只读int值;publicintValue{get{返回值;}}publicFoo(stringname,intvalue){this.name=name;this.value=值;}publicoverrideboolEquals(objectother){returnEquals(otherasFoo);}publicoverrideintGetHashCode(){inthash=17;hash=hash*31+(name==null?0:name.GetHashCode());哈希=哈希*31+值;返回散列;}publicboolEquals(Fooother){if((object)other==null){returnfalse;}returnname==other.name&&value==other.value;}publicstaticbooloperator==(Fooleft,Fooright){returnobject.Equals(left,right);}publicstaticbooloperator!=(Fooleft,Fooright){return!(left==right);}}是的,这是很多样板,实现之间的变化很小:(==的实现稍微更有效Poor因为它调用需要动态类型检查的Equals(object)...但替代方案是像这样的样板:公共静态布尔运算符r==(Fooleft,Fooright){if((object)left==(object)right){returntrue;}//“right”为null包含在left.Equals(right)if((object)left==null){returnfalse;}返回left.Equals(right);我很少为课堂做任何特别的事情;对于大多数常规对象,引用相等性很好,我写结构的频率更低;但是由于Structs表示值并且通常适当地提供相等性等。这通常涉及一切;等于,==,!=和IEquatable(因为这避免了在使用EqualityComparer.Default的情况下装箱。样板通常不是什么大问题,但是像resharper这样的IIRC工具可以在这里提供帮助。是的,建议保持Equals和==同步,这需要明确地完成。你只需要为==b实现运算符==。因为我喜欢字典中的数据,所以我有时会覆盖GetHashCode。接下来我实现Equals(作为一个未提及的标准......这是因为没有平等使用泛型时的约束)并指定IEquatable的实现。既然我要这样做,我不妨将我的==和!=实现指向等于。?请参阅什么是比较引用类型的两个实例的“最佳实践”“?您可以借助代码片段避免样板代码(希望C#/VS团队在下一次迭代中为开发人员带来一些简单的东西),这是这样的代码。以上是C#学习教程:C#Equationchecksall分享的内容,如果对大家有用,需要了解更多C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: