Как правильно сравнить 2 объекта из одного класса? - PullRequest
2 голосов
/ 12 июля 2020

У меня есть следующий класс dto:

public class Field
{
    public bool isEmptyField { get; set; }
    public bool isPawn { get; set; }
    public bool isDame { get; set; }
    public string color { get; set; }


    public Field(bool isEmptyField, bool isPawn, bool isDame, string color)
    {
        this.isEmptyField = isEmptyField;
        this.isPawn = isPawn;
        this.isDame = isDame;
        this.color = color;
    }
}

Может ли кто-нибудь сказать мне, почему я не могу сравнивать объекты из этого класса, когда я использую Equals() или ==?

Пример:

Условие

if (TypeOfGame.gameBoard[indexFrom].Equals(Constant.PAWN_RED))

enter image description here

enter image description here

Result with Equals()
enter image description here

Result with == введите описание изображения здесь

Кто-нибудь может это объяснить? Я новичок ie с C#, я действительно не знаю, что здесь происходит ...

1 Ответ

3 голосов
/ 12 июля 2020

Вам необходимо реализовать Equals метод Object, который больше ничего не делает для сравнения ссылок.

https://referencesource.microsoft.com/#mscorlib / system / object.cs, f2a579c50b414717, ссылки

public class Field : IEquatable<Field>
{
  public bool isEmptyField { get; set; }
  public bool isPawn { get; set; }
  public bool isDame { get; set; }
  public string color { get; set; }

  public Field(bool isEmptyField, bool isPawn, bool isDame, string color)
  {
    this.isEmptyField = isEmptyField;
    this.isPawn = isPawn;
    this.isDame = isDame;
    this.color = color;
  }

  public override bool Equals(object obj)
  {
    return Equals(this, obj as Field);
  }

  public bool Equals(Field obj)
  {
    return Equals(this, obj);
  }

  static public bool Equals(Field x, Field y)
  {
    return ( ReferenceEquals(x, null) && ReferenceEquals(y, null) )
        || (    !ReferenceEquals(x, null)
             && !ReferenceEquals(y, null)
             && ( x.isEmptyField == y.isEmptyField )
             && ( x.isPawn == y.isPawn )
             && ( x.isDame == y.isDame )
             && ( x.color == y.color ) );
  }
}

IEquatable<Field> не требуется, но может быть полезным и недорого.

Тест

var field1 = new Field(true, true, true, "test");
var field2 = new Field(true, true, true, "test");
var field3 = new Field(false, true, true, "test");
var field4 = new Field(true, true, true, "test2");

Console.WriteLine(field1.Equals(field2));
Console.WriteLine(field1.Equals(field3));
Console.WriteLine(field1.Equals(field4));
Console.WriteLine(field1.Equals(null));
Console.WriteLine(Field.Equals(null, null));

Вывод

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