Queue.Contains возвращает ложь вместо истины - PullRequest
0 голосов
/ 06 октября 2018

разработчики!Я наконец потерял логику.В чем проблема этого кода?Это должно вернуть истину для меня, потому что очередь включает в себя имя Джека.Почему бы и нет?Я использую метод неправильно?Спасибо за ваш ответ на мой простой вопрос!

 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; }
        }
    }

1 Ответ

0 голосов
/ 06 октября 2018

Ваш код работает нормально, и это абсолютно нормально, что он печатает "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, потому что по умолчанию ссылочные типы сравниваются по ссылке.

Когда вы вызываете Object.ReferenceEquals для переменных, пометьте и Генри, вы получите false, потому что эти переменные ссылаются на два разных адреса памяти, потому что два созданных вами объекта хранятся в разных адресах памяти кучи.

Если вы хотите сравнить объекты Employee с другой семантикой, например, сравнивая их имена, вы должны переопределить как Equals, так и GetHashCode.Я предлагаю вам внимательно прочитать вводную книгу по C #, такую ​​как эта

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...