如何在.NET中进行引用比较?

How to do reference comparison in .NET?

提问人:MiP 提问时间:4/13/2017 更新时间:4/14/2017 访问量:88

问:

F# 中的相等和比较约束中,它说:

请注意,没有“引用比较”之类的东西(.NET 使用的对象指针会四处移动,因此顺序会更改)。您可以通过使用唯一标记和自定义比较来实现这一点。

如何在 F# 和 C# 中使用唯一标记进行比较?

C .NET F# 比较 相等

评论

1赞 4/13/2017
F# 无权访问 Object.ReferenceEquals?C# 确实如此。MSDN .microsoft.com/en-gb/library/dd183759.aspx
1赞 4/13/2017
我假设“唯一标签和自定义比较”意味着“向对象添加属性并按其排序”。
0赞 Dustin Kingen 4/14/2017
本文提到,由于几乎所有 .NET 对象类型的默认值都是引用相等,因此并非所有 .NET 对象类型都支持 F# 的“比较”概念。
2赞 Dustin Kingen 4/14/2017
文章中提到的“唯一标记”和“自定义比较”可能意味着“覆盖 Equals/GetHashCode”和“继承 IComparable 和/或 IComparable(T)”。这在语句后面的示例中显示。
1赞 Dustin Kingen 4/14/2017
因此,总结一下有关本文的问题:“比较”是 F# 的一项功能,默认情况下不适用于所有 .NET 对象类型,因为大多数 .NET 对象类型使用引用相等,并且不实现 IComparable/IComparable(T)。

答:

2赞 Peter Duniho 4/14/2017 #1

如何在.NET中进行引用比较?如何在 F# 和 C# 中使用唯一标记进行比较?

请注意,在这种情况下,“比较”一词与“平等”不同。它描述了一种排序,而不仅仅是标识(这是支持的)。.正如参考文章所说,如果你想要订购,你必须自己强加。编译器无法为您推断一个,也不能有默认的“引用比较”,因为存在默认的“引用相等”。

可以应用该属性来要求类型实际上实现比较(类似于泛型约束),从而允许进行排序操作。这样,编译器就可以在编译时保证您的类型满足推断类型实现比较的要求。StructuralComparison: comparison

那么,如何进行“参考比较”呢?你没有!正如文章所说,这没有意义。您需要使用已经实现比较的类型,或者例如为您的类型实现,以便它满足约束。IComparable<T>comparison

如果您需要更多帮助,则需要更具体。发布一个问题,其中包括一个好的最小、完整和可验证的代码示例,显示你遇到的具体困难,尝试将参考文章中的建议应用到你自己的代码中,并准确解释你尝试过什么,以及你仍然难以工作的地方。