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

7
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设置为一个结构体 - 这会有所不同吗?


或者运行代码示例并检查结果 ;) - OregonGhost
5个回答

17

来自MSDN:

该方法使用默认的相等比较器EqualityComparer<T>.Default来确定相等性,其中T是列表中值的类型。

Default属性检查类型T是否实现了System.IEquatable<T>泛型接口,如果是,则返回一个使用该实现的EqualityComparer<T>。否则,它将返回一个使用T提供的Object.Equals和Object.GetHashCode重写的EqualityComparer<T>。

看起来它使用Equals方法,除非存储的类实现了IEquatable<T>接口。


2

这取决于对象对 .Equals(..) 方法的实现。默认情况下,对于一个对象,比较的是引用。如果您将其更改为结构体,则我认为它将根据私有成员的相等性评估为 true,但从编程角度来看,实现 IEquatable 更具可靠性。


2

对于一个类,默认实现Equals方法是按引用比较的。

如果将其改为tinyStruct,则会按值比较。


0

这也可能与列表中保留的类或结构实例有关,因为结构体的相等实现是基于值的相等性。


0

链接似乎已经(有效地)损坏了。它被重定向,但页面完全为空白(包括HTML源代码)。 - Peter Mortensen
失效链接,请使用:https://web.archive.org/web/20130726144116/blogs.microsoft.co.il/blogs/sasha/archive/2007/08.aspx - Nekoseri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接