List<> .IndexOf是按引用还是值进行比较?

时间:2008-10-06 20:05:36

标签: c# .net

List<tinyClass> ids = new List<tinyClass();
ids.Add(new tinyClass(1, 2));

bool b = ids.IndexOf(new tinyClass(1, 2)) >= 0; //true or false?

如果按值进行比较,则应返回true;如果通过引用,它将返回false 如果它通过引用进行比较,并且我将tinyClass设为一个结构 - 这会有所不同吗?

5 个答案:

答案 0 :(得分:16)

来自MSDN:

  

此方法使用默认的相等比较器EqualityComparer&lt; T&gt; .Default for T(列表中值的类型)确定相等性。

     

Default属性检查类型T是否实现System.IEquatable&lt; T&gt;通用接口,如果是,则返回EqualityComparer&lt; T&gt;使用该实现。否则,它返回EqualityComparer&lt; T&gt;。它使用由T。

提供的Object.Equals和Object.GetHashCode的覆盖

似乎它使用Equals方法,除非存储的类实现IEquatable&lt; T&gt;接口

答案 1 :(得分:2)

对于具有Equals的默认实现的类,它将通过引用进行比较。

如果将其更改为tinyStruct,它将按值进行比较。

答案 2 :(得分:1)

这取决于对象的.Equals(..)的实现。默认情况下,对象将比较引用。如果你确实把它改成了一个结构,那么我相信它会根据私有成员的相等性来评估为true,但实现IEquatable仍然会在程序上更合理。

答案 3 :(得分:0)

确保为您的struct实现.Equals(..),因为默认实现可能使用反射来比较每个字段,这非常昂贵。

阅读详情:http://blogs.microsoft.co.il/blogs/sasha/archive/2007/08.aspx

答案 4 :(得分:0)

它也可能与哪个Class或Struct实例保存在列表中有关,因为Structs等于实现基于值相等