我正在开发一个C#项目,直到现在,我一直使用不可变对象(immutable对象)和工厂来确保Foo类型的对象始终可以与=进行比较=。Foo对象一旦创建就不能更改,并且工厂总是为给定的一组参数返回相同的对象。这很好用,在整个代码库中,我们假设==始终用于检查相等性。现在我需要添加一些功能来引入一种边缘情况,但这并不总是有效。最简单的做法是为该类型重载operator==,这样项目中的其他代码都不需要更改。但这让我觉得是一种代码味道:重载operator==而不是Equals看起来很奇怪,而且我已经习惯了==检查引用相等性,而Equals检查对象相等性(或任何术语)。这是一个合理的担忧
我正在开发一个C#项目,直到现在,我一直使用不可变对象(immutable对象)和工厂来确保Foo类型的对象始终可以与=进行比较=。Foo对象一旦创建就不能更改,并且工厂总是为给定的一组参数返回相同的对象。这很好用,在整个代码库中,我们假设==始终用于检查相等性。现在我需要添加一些功能来引入一种边缘情况,但这并不总是有效。最简单的做法是为该类型重载operator==,这样项目中的其他代码都不需要更改。但这让我觉得是一种代码味道:重载operator==而不是Equals看起来很奇怪,而且我已经习惯了==检查引用相等性,而Equals检查对象相等性(或任何术语)。这是一个合理的担忧
当我使用IEquatableinterface实现要比较的对象时:为什么我必须覆盖Equals(object)方法,如果我已经实现Equals(T)?我可以使用==吗?和!=运营商一旦我实现IEquatable? 最佳答案 来自MSDocsarticleonIEquatable:IfyouimplementIEquatable,youshouldalsooverridethebaseclassimplementationsofEquals(Object)andGetHashCode()sothattheirbehavioriscon
当我使用IEquatableinterface实现要比较的对象时:为什么我必须覆盖Equals(object)方法,如果我已经实现Equals(T)?我可以使用==吗?和!=运营商一旦我实现IEquatable? 最佳答案 来自MSDocsarticleonIEquatable:IfyouimplementIEquatable,youshouldalsooverridethebaseclassimplementationsofEquals(Object)andGetHashCode()sothattheirbehavioriscon
我已经阅读了大约10个关于何时以及如何重写GetHashCode的不同问题,但仍有一些我不太明白。GetHashCode的大多数实现都基于对象字段的哈希码,但有人指出,GetHashCode的值在对象的整个生命周期内都不应更改。如果它所基于的字段是可变的,那将如何工作?另外,如果我确实希望字典查找等基于引用相等性而不是我覆盖的Equals怎么办?我主要覆盖Equals以便于对我的序列化代码进行单元测试,我假设序列化和反序列化(在我的情况下为XML)会破坏引用相等性,所以我想至少确保值(value)平等是正确的。在这种情况下重写Equals是一种不好的做法吗?基本上在大多数执行代码中,我
我已经阅读了大约10个关于何时以及如何重写GetHashCode的不同问题,但仍有一些我不太明白。GetHashCode的大多数实现都基于对象字段的哈希码,但有人指出,GetHashCode的值在对象的整个生命周期内都不应更改。如果它所基于的字段是可变的,那将如何工作?另外,如果我确实希望字典查找等基于引用相等性而不是我覆盖的Equals怎么办?我主要覆盖Equals以便于对我的序列化代码进行单元测试,我假设序列化和反序列化(在我的情况下为XML)会破坏引用相等性,所以我想至少确保值(value)平等是正确的。在这种情况下重写Equals是一种不好的做法吗?基本上在大多数执行代码中,我
背景我在当前项目中使用基于接口(interface)的编程,在重载运算符(特别是等式和不等式运算符)时遇到了问题。假设我正在使用C#3.0、.NET3.5和VisualStudio2008更新-以下假设是错误的!要求所有比较都使用等于而不是运算符==不是一个可行的解决方案,尤其是在将类型传递给库(例如集合)时。我担心要求使用Equals而不是operator==的原因是我在.NET指南中找不到任何地方声明它会使用Equals而不是operator==甚至建议它。然而,重读后GuidelinesforOverridingEqualsandOperator==我发现了这个:Bydefaul
背景我在当前项目中使用基于接口(interface)的编程,在重载运算符(特别是等式和不等式运算符)时遇到了问题。假设我正在使用C#3.0、.NET3.5和VisualStudio2008更新-以下假设是错误的!要求所有比较都使用等于而不是运算符==不是一个可行的解决方案,尤其是在将类型传递给库(例如集合)时。我担心要求使用Equals而不是operator==的原因是我在.NET指南中找不到任何地方声明它会使用Equals而不是operator==甚至建议它。然而,重读后GuidelinesforOverridingEqualsandOperator==我发现了这个:Bydefaul
有时我喜欢花一些时间查看.NET代码,看看幕后是如何实现的。我在通过Reflector查看String.Equals方法时偶然发现了这个gem。C#[ReliabilityContract(Consistency.WillNotCorruptState,Cer.MayFail)]publicoverrideboolEquals(objectobj){stringstrB=objasstring;if((strB==null)&&(this!=null)){returnfalse;}returnEqualsHelper(this,strB);}IL.methodpublichidebys
有时我喜欢花一些时间查看.NET代码,看看幕后是如何实现的。我在通过Reflector查看String.Equals方法时偶然发现了这个gem。C#[ReliabilityContract(Consistency.WillNotCorruptState,Cer.MayFail)]publicoverrideboolEquals(objectobj){stringstrB=objasstring;if((strB==null)&&(this!=null)){returnfalse;}returnEqualsHelper(this,strB);}IL.methodpublichidebys