Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Contains返回false而不是true_C#_Collections - Fatal编程技术网

C# Contains返回false而不是true

C# Contains返回false而不是true,c#,collections,C#,Collections,开发者! 我终于失去了逻辑。这个代码的问题是什么? 对我来说,它必须返回true,因为我的名字是Jack。 为什么不呢?我是否以错误的方式使用方法? 谢谢你回答我的简单问题 namespace DataStructures { class Program { static void Main(string[] args) { Queue<Employee> lin

开发者! 我终于失去了逻辑。这个代码的问题是什么? 对我来说,它必须返回true,因为我的名字是Jack。 为什么不呢?我是否以错误的方式使用方法? 谢谢你回答我的简单问题

 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#的介绍性书籍,比如