7

我有一个可变类,用作通用字典的键。只有当它们的引用相等时,两个键才应该相等。根据我的阅读,在这种情况下,我不需要重写 Equals、GetHashCode 或实现 IEqualityComparer。

这个对吗?

4

6 回答 6

16

是的。System.Object 中的默认比较操作使用引用相等。如果这种行为是您想要的,那么默认值应该可以正常工作。

于 2010-03-16T15:34:40.137 回答
1

是的,这是正确的。 只要您不覆盖,reference 就是默认比较。

于 2010-03-16T15:35:46.750 回答
1

我将补充其他所有人在这里所说的话(是的),但还有一点似乎没有人在这里提到过。

当使用泛型集合(字典、列表等)时,您可以覆盖IEquatable以提供一个特定于类型的版本,该版本可以在没有装箱或向上/向下转换的情况下进行比较。这些通用集合将在存在时使用此重载进行比较,并且它可能更有效。

如文档中所述,在实现 IEquatable 时,您仍然需要从 Object 覆盖 Equals/Hashcode。

于 2010-03-16T15:50:02.887 回答
0

正如其他人已经指出的那样,是的,你是对的。事实上,如果你的类型是可变的(它有 setter),你肯定不想重写等式成员。但是,如果您想要使用类型中的值进行相等性检查,您可以String通过确保没有设置器(只有构造函数设置值)来使您的类型不可变(如 )。或使用struct.

于 2010-03-16T15:39:25.253 回答
0

对于使用 .Net 5 或更高版本的任何人,它都带有一个ReferenceEqualityComparer类,您可以将其传递给字典的构造函数。这意味着您不必担心将来有人会覆盖 GetHashCode 和 Equals。

于 2021-11-24T10:58:10.880 回答
-1

是的,如果没有指定其他重载,则对两个对象进行 == 比较(或 .Equals)是正确的,比较它们的引用。

String s = "a";

object test1 = (object)s;
object test2 = (object)s;

Debug.Assert(test1.Equals(test2));
于 2010-03-16T15:35:26.813 回答