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设为一个结构 - 这会有所不同吗?
答案 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等于实现基于值相等