C# Contains返回false而不是true
开发者! 我终于失去了逻辑。这个代码的问题是什么? 对我来说,它必须返回true,因为我的名字是Jack。 为什么不呢?我是否以错误的方式使用方法? 谢谢你回答我的简单问题C# Contains返回false而不是true,c#,collections,C#,Collections,开发者! 我终于失去了逻辑。这个代码的问题是什么? 对我来说,它必须返回true,因为我的名字是Jack。 为什么不呢?我是否以错误的方式使用方法? 谢谢你回答我的简单问题 namespace DataStructures { class Program { static void Main(string[] args) { Queue<Employee> lin
namespace DataStructures
{
class Program
{
static void Main(string[] args)
{
Queue<Employee> line = new Queue<Employee>();
line.Enqueue(new Employee { Name = "Jack" });
line.Enqueue(new Employee { Name = "Nick" });
line.Enqueue(new Employee { Name = "Vova" });
line.Enqueue(new Employee { Name = "Andrew" });
Console.WriteLine(line.Contains(new Employee { Name = "Jack" }));
Console.ReadLine();
}
}
class Employee
{
public string Name { get; set; }
}
}
命名空间数据结构
{
班级计划
{
静态void Main(字符串[]参数)
{
队列行=新队列();
line.Enqueue(新员工{Name=“Jack”});
line.Enqueue(新员工{Name=“Nick”});
line.Enqueue(新员工{Name=“Vova”});
line.Enqueue(新员工{Name=“Andrew”});
WriteLine(line.Contains(newemployee{Name=“Jack”}));
Console.ReadLine();
}
}
班级员工
{
公共字符串名称{get;set;}
}
}
您的代码运行正常,打印“false”是绝对正常的
您称为Employee的类型是一个类,因此它是一个引用类型。
默认情况下,参照类型按参照进行比较。
这是System.Object中定义的相等语义,它由所有类继承,除非提供了Equals方法的重写
每次编写代码new Employee()时,您都在创建类Employee的一个新实例:这基本上意味着您正在创建一个新对象,并在堆中分配新内存(这是C#对象所在的计算机内存的一部分)
请看以下代码:
var mark = new Employee(){ Name = "Mark" };
var henry = new Employee() { Name = "Henry" };
var areEquals = mark.Equals(henry);
var areSameReference = Object.ReferenceEquals(mark, henry);
Console.WriteLine(areEquals); // this will print false
Console.Writeline(areSameReference); // this will print false
在上面的代码中,您创建了类Employee的两个不同实例,并在堆中创建了两个不同的对象(换句话说,您分配了两个不同的内存空间以存储两个不同的对象)。这就是为什么当调用Equals时会得到false,因为默认情况下引用类型是按引用进行比较的
在变量mark和henry上调用Object.ReferenceEquals时,会得到false,因为变量引用的是两个不同的内存地址,因为您创建的两个对象存储在堆的不同内存地址中
如果要用不同的语义比较Employee对象,例如通过比较它们的名称,则必须重写Equals和GetHashCode。我建议你仔细阅读一本关于C#的介绍性书籍,比如