- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
大家有没有意见IEquatable<T>
或 IComparable<T>
通常应该要求 T
是sealed
(如果它是 class
)?
我想到了这个问题,因为我正在编写一组旨在帮助实现不可变类的基类。基类旨在提供的部分功能是相等比较的自动实现(使用类的字段以及可应用于字段以控制相等比较的属性)。当我完成时它应该非常好 - 我正在使用表达式树为每个 T
动态创建一个编译比较函数,因此比较函数应该非常接近常规相等比较函数的性能。 (我正在使用以 System.Type
为键的不可变字典并仔细检查锁定以合理执行的方式存储生成的比较函数)
不过突然出现的一件事是使用什么函数来检查成员字段的相等性。我的初衷是检查每个成员字段的类型(我称之为 X
)是否实现了 IEquatable<X>
.但是,经过一番思考,我认为除非X
,否则使用起来不安全。是sealed
.原因是如果X
不是 sealed
,我不确定是否X
适本地将相等性检查委托(delegate)给 X
上的虚方法,从而允许子类型覆盖相等比较。
这就提出了一个更普遍的问题——如果一个类型不是密封的,它真的应该实现这些接口(interface)吗??我不这么认为,因为我认为接口(interface)契约是在两个 X
之间进行比较。类型,而不是可能是也可能不是 X
的两种类型(尽管它们当然必须是 X
或一个子类型)。
大家怎么看?应该IEquatable<T>
和 IComparable<T>
避免使用未密封的类(class)? (也让我想知道是否有一个 fxcop 规则)
我目前的想法是让我生成的比较函数只使用 IEquatable<T>
在其 T
的成员字段上是sealed
, 而不是使用虚拟 Object.Equals(Object obj)
如果T
即使 T
也未密封工具 IEquatable<T>
,因为该字段可能存储 T
的子类型我怀疑 IEquatable<T>
的大多数实现为继承而设计。
最佳答案
我一直在思考这个问题,经过一番考虑后,我同意实现 IEquatable<T>
和 IComparable<T>
应该只对密封类型进行。
我来回想了一会儿,然后想到了以下测试。在什么情况下以下应该返回 false?恕我直言,2 个对象要么相等,要么不相等。
public void EqualitySanityCheck<T>(T left, T right) where T : IEquatable<T> {
var equals1 = left.Equals(right);
var equals2 = ((IEqutable<T>)left).Equals(right);
Assert.AreEqual(equals1,equals2);
}
IEquatable<T>
的结果在给定对象上应具有与 Object.Equals
相同的行为假设比较器是等效类型。实现 IEquatable<T>
twice in an object hierarchy 允许并暗示在您的系统中有两种不同的表达相等性的方式。设计任意数量的场景很容易 IEquatable<T>
和 Object.Equals
会有所不同,因为有多个 IEquatable<T>
实现,但只有一个 Object.Equals
.因此,上面的代码会失败并在您的代码中造成一些困惑。
有些人可能会争辩说实现IEquatable<T>
在对象层次结构的较高位置是有效的,因为您要比较对象属性的子集。在那种情况下,你应该喜欢 IEqualityComparer<T>
它专门用于比较这些属性。
关于c# - IEquatable<T>、IComparable<T> 是否应该在非密封类上实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1868316/
我如何实现 IComparer int CompareTo(object obj) 有一个额外的参数,比如 int CompareTo(object obj, Dictionary preferenc
我在正确使用 IComparable<> 时遇到了一些麻烦界面。我还创建了一个实现 IComparer<> 的类.我几乎从一本书中复制了确切的编码示例,但对其进行了重新设计以适应我的情况,但它似乎无法
我是否应该同时实现 IComparable和通用 IComparable ?如果我只实现其中之一,是否有任何限制? 最佳答案 是的,您应该同时实现两者。 如果你实现其中一个,任何依赖于另一个的代码都会
这个问题在这里已经有了答案: When to use IComparable Vs. IComparer (8 个答案) 关闭 4 年前。 IComparable 和IComparer 接口(int
我正在尝试实现此链接的相同示例,但更注重受抚养 child 的数量。 http://www.codeproject.com/Articles/42839/Sorting-Lists-using-ICo
在大多数地方,我读到从 IComparable 继承是个好主意。和 IComparable在你的类中提供与非通用集合的兼容性。我的问题是为什么IComparable不继承自 IComparable那么
我正在使用 WPF 博士的 ObservableSortedDictionary。 构造函数如下所示: public ObservableSortedDictionary(IComparer comp
我知道 IComparable 之间有很大的区别和 IComparable一般情况下,请参阅 this , 但在这种搜索方法中,它不会有任何区别,还是会这样? public static int Se
我是 C# 的新手(6 个月的工作经验),但它看起来与 Java 非常相似,所以我感觉很自在。 但是,今天我尝试实现 IComparer 接口(interface)并想知道为什么它会给我一个错误: p
我有 Employee 类,我需要实现 IComparable 并使用 CompareTo 方法按姓名对员工进行排序。据我所知,我必须返回 1、-1 和 0,但我该如何使用这些字符串? 这是我的。 c
是否可以使用 iComparer 使用对象中的两个值对列表进行排序? 我有一个基于 value1 排序的自定义比较器类。但是对 value1 和 value2 进行排序的最佳方法是什么? 按 valu
我为装箱的 RegistryItem 对象定义了以下 IComparer: public class BoxedRegistryItemComparer : IComparer { publi
我正在尝试在相似值列表中获取唯一值,仅通过管道分隔字符串中的一个元素来区分...我不断得到至少一个对象必须实现 Icomparable。我不明白为什么我总是得到这个。我能够按该值进行分组...为什么我
假设我们有这 3 个类: Class BaseClass : System.IComparable { [int] $Value BaseClass([int] $v) {
所以我在这个错误上画了一个空白。无法比较数组中的两个元素。Array.Sort(患者);是产生错误的地方。我确实有一个 IComparable 接口(interface)和一个包含以下代码的类文件:T
我刚开始尝试使用 IEnumerable 接口(interface)。我总是只编写自定义哈希排序而不是尝试使用 native 语法,因为我对实现有些困惑。我正在尝试确定是否可以使用 BinarySea
我有一个 MyClass 类,我想像这样把它作为字典的键: Dictionary dict = new Dictionary(); 我想确保 MyClass 是唯一键,唯一性是通过查看 MyClass
在下面的代码中,我以 .NET 2.0 Framework 为目标。 我可以将 Programmer(派生)对象传递给需要 Person(基类)的 Compare 方法 但由于程序员是一个人(简单的
我正在尝试使用 IComparer 对对象数组进行排序。 我编写了代码,但它仅适用于特定对象。例如: 这门课 public class Cars { public string Name {
如何实现需要参数的 IComparer(可能不相关,但我在 Linq 查询中使用它)? 我想它应该这样称呼: ListOfObjectsToSort.orderBy(x => x, myCustomC
我是一名优秀的程序员,十分优秀!