通过引用而不是值来命令.NET对象

时间:2010-11-08 16:20:29

标签: .net comparison reference

如何通过引用订购(比较).NET对象?我会用它来有效地确定两个.NET集合是否包含相同的实例(通过引用,而不是值)。

另一种表达这个问题的方法可能是要求IComparer的实现,它使用参考比较而不是值比较。

在Java中注意我使用System.identityHashCode()

4 个答案:

答案 0 :(得分:5)

使用Object.ReferenceEquals()

请注意,使用==运算符比较reference types也可以执行您想要的操作,除非在这些类型中重写了相等运算符。

编辑: System.ObjectGetHashCode(),其工作方式与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)