Как struct реализует Equals - PullRequest
       3

Как struct реализует Equals

0 голосов
/ 26 сентября 2018

У меня есть структура

public struct item
{
    public int id { get; set; }
    public string name { get; set; }
}

Если я создаю HashSet<item> и добавляю два равных элемента, второй не вставляется, потому что он уже существует (кажется, что equals выбрасывает одно и то же значение)

HashSet<item> hsi = new HashSet<item>();
Console.WriteLine(hsi.Add(new item() { id = 1, name = "test" })); //true
Console.WriteLine(hsi.Add(new item() { id = 1, name = "test" })); //false - expected result

сейчас Если я изменим struct на class

public class item //changed struct to class
{
    public int id { get; set; }
    public string name { get; set; }
}

, то получится

HashSet<item> hsi = new HashSet<item>();
Console.WriteLine(hsi.Add(new item() { id = 1, name = "test" })); //true
Console.WriteLine(hsi.Add(new item() { id = 1, name = "test" })); //true

вопрос: почему равно работает для структуры, но недля класса?

1 Ответ

0 голосов
/ 26 сентября 2018

Для структур (типов значений) Equals сравнивает все значение структуры, то есть все поля.

Реализация по умолчанию object.Equals() (для классов) делает ссылку сравнение.Он сравнивает, если две ссылки "указывают" на один и тот же экземпляр класса, но не сравнивает содержимое экземпляров.


, поэтому сравнение структуры нене работает, если одно из свойств является объектом, например, List<int>?

Это работает ", но, возможно, не так, как вы ожидаете.Он не будет сравнивать содержимое списков, он только проверяет, ссылаются ли свойства на один и тот же экземпляр списка.
Если вы хотите глубоко сравнить их, вам нужно переопределить Equals и реализовать егосебя.

Но обратите внимание, что он работает с string, потому что при сравнении свойств вызывается метод этих свойств Equals, и string.Equals() переопределяется для сравнения содержимого строки.

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