如何通过引用订购(比较).NET对象?我会用它来有效地确定两个.NET集合是否包含相同的实例(通过引用,而不是值)。
另一种表达这个问题的方法可能是要求IComparer
的实现,它使用参考比较而不是值比较。
在Java中注意我使用System.identityHashCode()
。
答案 0 :(得分:5)
请注意,使用==
运算符比较reference types也可以执行您想要的操作,除非在这些类型中重写了相等运算符。
编辑: System.Object
有GetHashCode(),其工作方式与Java的hashCode()
相同。它的行为可能与identityHashCode()
类似,足以满足您的需求,但我无法理解比较引用或哈希代码如何代表对象的实际值。
答案 1 :(得分:1)
不能直接回答您的问题,而是使用LINQ解决您的实际问题:
IEnumerable<Foo> items = new List<Foo>(){ new Foo(), new Foo() };
IEnumerable<Foo> otheritems = items;
bool identical = items.Intersect(otheritems).ToArray().Count() == items.Count();
这可以通过比较引用来实现,除非在Equals
类型中覆盖Foo
方法。
答案 2 :(得分:1)
你不能通过引用直接命令.NET对象......显然你甚至不能使用“不安全”代码将引用转换为整数:
unsafe int ReferenceToInt(object o)
{
// Error: cannot declare a pointer to a managed type.
fixed (object* ptr = o)
return (int)ptr;
}
无论如何,这不是一个好主意,因为压缩垃圾收集不仅可以更改每个对象的地址,还可以更改对象之间的相对顺序。即使GC没有改变相对顺序,GC也可以随时运行,这将使得按引用排序非常危险。
GetHashCode()
的默认实现会返回您可以使用的某种对象ID。并且,正如Frédéric所提到的,您可以使用Object.ReferenceEquals()来确认两个引用是相同的。
最后,在大多数情况下,您应该像其他人提到的那样使用Dictionary,HashSet或LINQ。
答案 3 :(得分:0)