Стандартное поведение метода Equals()
Person
по имени pi
. В этот момент новый объект Person
помещается в управляемую кучу. Переменная р2
также относится к типу Person
. Тем не менее, вместо создания р2
присваивается ссылка pi
. Таким образом, переменные pi
и р2
указывают на один и тот же объект в памяти, как и переменная о
(типа object
). Учитывая, что pi
, р2
и о
указывают на одно и то же местоположение в памяти, проверка эквивалентности дает положительный результат.Хотя готовое поведение System.Object
Person
, добавив свойства, которые представляют имя, фамилию и возраст лица; все они могут быть установлены с помощью специального конструктора:// Не забывайте, что класс Person расширяет Object.
class Person
{
public string FirstName { get; set; } = "";
public string LastName { get; set; } = "";
public int Age { get; set; }
public Person(string fName, string lName, int personAge)
{
FirstName = fName;
LastName = lName;
Age = personAge;
}
public Person(){}
}
Переопределение метода System.Object.ToString()
Многие создаваемые классы (и структуры) могут извлечь преимущества от переопределения метода ToString()
ToString()
для класса Person
:public override string ToString()
=> $"[First Name: {FirstName}; Last Name: {LastName};
Age:
{Age}]";
Приведенная реализация метода ToString()
Person
содержит всего три порции данных состояния. Тем не менее, всегда помните о том, что правильное переопределение ToString()
должно также учитывать любые данные, определенные При переопределении метода ToString()
ToString()
из родительского класса, используя ключевое слово base
. После получения строковых данных родительского класса их можно дополнить специальной информацией производного класса.Переопределение метода System.Object.Equals()
Давайте также переопределим поведение метода Object.Equals()
Equals()
возвращает true
, только если два сравниваемых объекта ссылаются на один и тот же экземпляр объекта в памяти. Для класса Person
может оказаться полезной такая реализация Equals()
, которая возвращает true
, если две сравниваемые переменные содержат те же самые значения состояния (например, фамилию, имя и возраст).Прежде всего, обратите внимание, что входной аргумент метода Equals()
System.Object
. В связи с этим первым делом необходимо удостовериться в том, что вызывающий код действительно передал экземпляр типа Person
, и для дополнительной подстраховки проверить, что входной параметр не является ссылкой null
.После того, как вы установите, что вызывающий код передал выделенный экземпляр Person
Equals()
для сравнения поле за полем данных входного объекта с данными текущего объекта:public override bool Equals(object obj)
{
if (!(obj is Person temp))
{
return false;
}
if (temp.FirstName == this.FirstName
&& temp.LastName == this.LastName
&& temp.Age == this.Age)
{
return true;
}
return false;
}