c# - 字典中结构键的值相等和类键的引用相等

标签 c# generics dictionary reference equality

我正在实现一个通用字典。我希望 TKey 是结构或类。如果它是一个结构,我想按值比较键,否则按引用。

我既不能使用 Object.Equals(仅适用于结构)也不能使用 Object.ReferenceEquals(仅适用于引用类型)。那我用什么方法来判断是否相等呢?

== 运算符可能会解决这个问题,但如果不为键指定任何约束(where TKey : ...)我就无法使用它。我应该声明哪些接口(interface)?

最佳答案

I can't use neither Object.Equals (only works with structs) nor Object.ReferenceEquals (only works with reference types).

看来您可能只是误解了它们的工作原理。 System.Object.Equals() 无论是处理值类型还是引用类型,方法实现都同样有效(没有双关语意)。

对于值类型,它会逐个字段进行比较。如果被比较的两个值是相同的类型,并且它们的每个字段都具有相同的值,那么它们被认为是相等的。

对于引用类型,它只是使用引用相等性,正如您所希望的那样。

请注意,类型可以覆盖此方法,因此实际使用的实现可能与上述不同。例如,string type 覆盖了方法,所以两个不是同一个实例的字符串仍然可以比较相等。但默认情况下,会发生上述情况。

最后我会指出,如果您想要的是一种完全像 Dictionary<TKey, TValue> 的行为类,最好的解决方案可能就是只使用该类。 :)

关于c# - 字典中结构键的值相等和类键的引用相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29720108/

相关文章:

c# - TDD - 我做得对吗?

c# - C#'s can' t 使 `notnull` 类型可以为空

Java 泛型类,如何为可能的参数类型定义构造函数

java - Guava 为什么 toStringFunction 不是泛型函数?

c# - 使用 Dictionary<Foo, Foo> 代替 List<Foo> 来加快对 Contains() 的调用

c# - 为什么用 npoi 编辑后 docx 文件损坏

c# - 在 lambda 函数中使用 'out' 参数有什么技巧吗?

pointers - 扫描错误 : sql: Scan error on column index 11: destination not a pointer

javascript - 网络表单 : determines which control within updatepanel triggers the refresh

python - 按python中的值对字典进行排序