C# 是否列出<>;。通过引用或值进行比较的索引? List id=newlist=0//对还是错?

C# 是否列出<>;。通过引用或值进行比较的索引? List id=newlist=0//对还是错?,c#,.net,C#,.net,如果按值进行比较,则应返回true;如果通过引用,则返回false。 如果通过引用进行比较,我将tinyClass设置为结构-这会有区别吗?来自MSDN: 此方法使用默认的相等比较器EqualityComparer确定相等。默认值为T,列表中的值类型 默认属性检查类型T是否实现System.IEquatable泛型接口,如果是,则返回使用该实现的EqualityComparer。否则,它返回一个EqualityComparer,使用T提供的Object.Equals和Object.GetHash

如果按值进行比较,则应返回true;如果通过引用,则返回false。
如果通过引用进行比较,我将tinyClass设置为结构-这会有区别吗?

来自MSDN:

此方法使用默认的相等比较器EqualityComparer确定相等。默认值为T,列表中的值类型

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


它似乎使用Equals方法,除非存储类实现了IEquatable接口。

它取决于对象的.Equals(..)实现。默认情况下,将比较对象的引用。如果您确实将其更改为结构,那么我相信它将根据私有成员的相等性计算为true,但是实现IEquatable在编程上更合理。

对于类,默认实现为Equals-它将通过引用进行比较


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

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


阅读更多信息:

它也可能与列表中保留了哪些类或结构实例有关,因为Structs equal实现基于值equality

,或者运行代码示例并检查结果;)
List<tinyClass> ids = new List<tinyClass();
ids.Add(new tinyClass(1, 2));

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