помощи.
Допустим есть два класса:
public class Father
{
public string FatherName{get;set;}
public int SomethingNonUseful {get;set;}
}
public sealed class Son : Father
{
public string SonName{get;set;}
}
Для неких манипуляций мне нужно проверять два объекта через .Equals.
Правильно ли я понимаю, что наследуясь от IEquatable<MarketKey> в FatherName для определённых для меня полей
public class Father : IEquatable<Father>
{
public string FatherName{get;set;}
public int SomethingNonUseful {get;set;}
public bool Equals(Father? other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
return FatherName == other.FatherName;
}
public override bool Equals(object? obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((Father)obj);
}
public override int GetHashCode()
{
return FatherName.GetHashCode();
}
}
Текущая перегрузка для .Equals будет валидна и вызываться ТОЛЬКО для Father и не будет иметь никакого отношения к Son?
Есть полная уверенность что две сущности, которые будут проверяться будут строго типа Father (father1.Equals(father2))
неправильно считать хэш на mutable элементах класса
это ведёт к undefined behaviour
Таке життя
для таких целей лучше использовать record public sealed record Father(string Name, int SomethingNonUseful);
Так а в чём разница? Практически 1 в 1 https://sharplab.io/#v2:CYLg1APgAgTAjAWAFBQMwAJboMLoN7LpGYYBOApgMYD2pw6AggEYCGrAFFHAAyMA0mHugBCASgDcyAL5A===
record то шо называется immutable и при этом для него определены и IEquatable и IComparable
якщо створиш Son і скастиш до Father то буде
будет вызываться Equals(Father?) если ты скастишь аргумент к типу Father
Обсуждают сегодня