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设置为一个结构体 - 这会有所不同吗?
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设置为一个结构体 - 这会有所不同吗?
来自MSDN:
该方法使用默认的相等比较器EqualityComparer<T>.Default来确定相等性,其中T是列表中值的类型。
Default属性检查类型T是否实现了System.IEquatable<T>泛型接口,如果是,则返回一个使用该实现的EqualityComparer<T>。否则,它将返回一个使用T提供的Object.Equals和Object.GetHashCode重写的EqualityComparer<T>。
看起来它使用Equals方法,除非存储的类实现了IEquatable<T>接口。
这取决于对象对 .Equals(..) 方法的实现。默认情况下,对于一个对象,比较的是引用。如果您将其更改为结构体,则我认为它将根据私有成员的相等性评估为 true,但从编程角度来看,实现 IEquatable 更具可靠性。
对于一个类,默认实现Equals方法是按引用比较的。
如果将其改为tinyStruct,则会按值比较。
这也可能与列表中保留的类或结构实例有关,因为结构体的相等实现是基于值的相等性。