- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
摘自MSDN上 IEqualityComparer<T>
备注部分:
We recommend that you derive from the EqualityComparer<T> class instead of implementing the IEqualityComparer<T> interface, because the EqualityComparer<T> class tests for equality using the IEquatable<T>.Equals method instead of the Object.Equals method. ...
我不理解引用中关于我们为什么更愿意从 EqualityComparer<T>
类派生而不是实现 IEqualityComparer<T>
的论点。这意味着实现 IEqualityComparer<T>
的对象将使用 Object.Equals
测试相等性,但是当我们不想使用 IEqualityComparer<T>
或 Object.Equals
测试相等性时,实现 IEquatable<T>.Equals
不是全部意义所在吗?
这也意味着如果我们从 EqualityComparer<T>
派生,那么派生类将使用 IEquatable<T>.Equals
方法测试是否相等。同样,当我们不想使用 EqualityComparer<T>
或 Object.Equals
测试相等性时(因为 IEquatable<T>.Equals
已经使用 EqualityComparer<T>.Default
或 Object.Equals
进行测试),从 IEquatable<T>.Equals
派生的全部意义不是吗?
... This is consistent with the Contains, IndexOf, LastIndexOf, and Remove methods of the Dictionary<TKey, TValue> class and other generic collections.
我假设 .NET 库中的大多数集合通过调用 IEqualityComparer<T>
或 IEquatable<T>.Equals
测试元素的默认相等性(即当用户不向这些集合提供他们自己的自定义 Object.Equals
对象时) (取决于类型 T
的元素是否实现 IEquatable<T>
)通过 EqualityComparer<T>.Default
。
为什么这些集合(在测试默认相等性时)不直接调用 IEquatable<T>.Equals
或 Object.Equals
而不是通过 EqualityComparer<T>.Default
类?
最佳答案
关于您的第一个问题:
备注部分为 IEqualityComparer<T>
class 似乎并没有真正提供为什么您应该更喜欢从抽象类派生而不是接口(interface)的原因,这听起来更像是平等比较器接口(interface)首先存在的原因。它所说的实际上是无用的,它基本上描述了默认实现正在做什么。如果有的话,他们在这里提供的“推理”听起来更像是你的比较者可以做什么的指南,而与它实际做什么无关。
查看 EqualityComparer<T>
的公共(public)/ protected 接口(interface)类,只有一个可取之处,它实现了非泛型 IEqualityComparer
界面。我认为他们的意思是说他们建议从中派生,因为 EqualityComparer<T>
实际上实现了非泛型 IEqualityComparer
接口(interface),这样你的类就可以在需要非通用比较器的地方使用。
在 IComparer<T>
的备注部分确实更有意义:
We recommend that you derive from the
Comparer<T>
class instead of implementing theIComparer<T>
interface, because theComparer<T>
class provides an explicit interface implementation of theIComparer.Compare
method and theDefault
property that gets the default comparer for the object.
我怀疑它应该为 IEqualityComparer<T>
说类似的话但有些想法被混淆了,最终导致描述不完整。
关于你的第二个问题:
图书馆馆藏的主要目标是尽可能灵活。一种方法是允许通过提供 IComparer<T>
来比较对象中的自定义方法。或 IEqualityComparer<T>
做比较。在没有提供默认比较器的情况下获取默认比较器的实例比直接进行比较要容易得多。这些比较器反过来可以包含调用适当打包的适当比较所需的逻辑。
例如,默认比较器可以确定是否T
工具 IEquatable<T>
并调用IEquatable<T>.Equals
在物体上或以其他方式使用 Object.Equals
.最好封装在比较器中,而不是可能在集合代码中重复。
此外,如果他们想退回到调用 IEquatable<T>.Equals
直接地,他们必须在 T
上添加约束这将使这个电话成为可能。这样做会降低灵 active ,并抵消了首先提供比较器的好处。
关于c# - 更喜欢 EqualityComparer<T> 而不是 IEqualityComparer<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5707347/
我对这个错误很困惑: Cannot implicitly convert type 'System.Func [c:\Program Files (x86)\Reference Assemblies\
考虑这段代码: pub trait Hello { fn hello(&self); } impl Hello for Any { fn hello(&self) {
问题很简单。是否可以构造这样一个类型 T,对于它下面的两个变量声明会产生不同的结果? T t1 = {}; T t2{}; 我已经研究 cppreference 和标准一个多小时了,我了解以下内容:
Intellij idea 给我这个错误:“Compare (T, T) in Comparator cannot be applied to (T, T)” 对于以下代码: public class
任何人都可以告诉我 : n\t\t\t\t\n\t\t\t 在以下来自和 dwr 服务的响应中的含义和用途是什么. \r\n\t\t\t \r\n\t\t\t
让 T 成为一个 C++ 类。 下面三个指令在行为上有什么区别吗? T a; T a(); T a = T(); T 为不带参数的构造函数提供了显式定义这一事实是否对问题有任何改变? 后续问题:如果
Rust中的智能指针是什么 智能指针(smart pointers)是一类数据结构,是拥有数据所有权和额外功能的指针。是指针的进一步发展 指针(pointer)是一个包含内存地
比如我有一个 vector vector > v={{true,1},{true,2},{false,3},{false,4},{false,5},{true,6},{false,7},{true,8
我有一个来自 .xls 电子表格的数据框,我打印了 print(df.columns.values) 列,输出包含一个名为:Poll Responses\n\t\t\t\t\t。 我查看了 Excel
This question already has answers here: What are good reasons for choosing invariance in an API like
指针类型作为类型前缀与在类型前加斜杠作为后缀有什么区别。斜线到底是什么意思? 最佳答案 语法 T/~ 和 T/& 基本上已被弃用(我什至不确定编译器是否仍然接受它)。在向新向量方案过渡的初始阶段,[T
我正在尝试找到一种方法来获取模板参数的基类。 考虑以下类: template class Foo { public: Foo(){}; ~Foo(){};
这是一个让我感到困惑的小问题。我不知道如何描述它,所以只看下面的代码: struct B { B() {} B(B&) { std::cout ::value #include
为什么有 T::T(T&) 而 T::T(const T&) 更适合 copy ? (大概是用来实现move语义的???) 原始描述(被melpomene证明是错误的): 在C++11中,支持了一种新
在 Java 7 中使用 eclipse 4.2 并尝试实现 List 接口(interface)的以下方法时,我收到了警告。 public T[] toArray(T[] a) { ret
假设有三个函数: def foo[T](a:T, b:T): T = a def test1 = foo(1, "2") def test2 = foo(List(), ListBuffer()) 虽
我对柯里化(Currying)和非柯里化(Currying)泛型函数之间类型检查的差异有点困惑: scala> def x[T](a: T, b: T) = (a == b) x: [T](a: T,
考虑一个类A,我如何编写一个具有与相同行为的模板 A& pretty(A& x) { /* make x pretty */ return x; } A pretty(A&& x) {
Eclipse 表示由于泛型类型橡皮擦,类型参数不允许使用 instanceof 操作。 我同意在运行时不会保留任何类型信息。但是请考虑以下类的通用声明: class SomeClass{ T
在 C++14 中: 对于任何整数或枚举类型 T 以及对于任何表达式 expr: 有没有区别: struct S { T t { expr }; }; 和 struct S { T t = { exp
我是一名优秀的程序员,十分优秀!