Встречается на собеседованиях • сегодня

Когда мы сравниваем ссылочный тип, что мы сравниваем

Когда происходит сравнение ссылочных типов, обычно сравниваются ссылки на объекты в памяти. Это означает, что сравнение покажет `true` (истину), только если обе переменные ссылаются на один и тот же экземпляр объекта в памяти, то есть если они указывают на одно и то же место в куче.

Сравнение по ссылке
Для ссылочных типов:

text
```csharp
var objectA = new MyClass();
var objectB = new MyClass();
var objectC = objectA;

bool areEqual = objectA == objectB; // False, потому что это разные экземпляры объектов
bool areAlsoEqual = objectA == objectC; // True, потому что objectC ссылается на тот же объект, что и objectA
```

В этом примере `objectA` и `objectB` являются разными объектами, хотя они могут быть экземплярами одного и того же класса и иметь одинаковые значения в своих полях. Переменная

`objectC` ссылается на тот же объект, что и `objectA`, поэтому сравнение `objectA == objectC` возвращает `true`.

Переопределение методов Equals и GetHashCode
Для более глубокого контроля над тем, как происходит сравнение объектов, в C# можно переопределить методы `Equals()` и `GetHashCode()`. Метод `Equals()` можно переопределить, чтобы обеспечить сравнение по значению, т.е. сравнивать объекты на основе значений их полей, а не их идентичности в памяти.

Например, если у вас есть класс `Person` с полями `Name` и `Age`, вы можете переопределить `Equals()` следующим образом:

text
```csharp
public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    public override bool Equals(object obj)
    {
        if (obj is Person other)
        {
            return this.Name == other.Name && this.Age == other.Age;
        }
        return false;
    }

    public override int GetHashCode()
    {
        return HashCode.Combine(Name, Age);
    }
}
```

С этим переопределением, два разных экземпляра `Person` с одинаковыми значениями для `Name` и `Age` будут считаться равными при использовании `Equals()`:

text
```csharp
var person1 = new Person { Name = "John", Age = 30 };
var person2 = new Person { Name = "John", Age = 30 };

bool arePeopleEqual = person1.Equals(person2); // True, если Name и Age одинаковы
```

При сравнении ссылочных типов по умолчанию сравниваются ссылки на объекты. Для осуществления сравнения по значению полям объекта, необходимо переопределить методы `Equals()` и `GetHashCode()`. Это позволяет задать собственные критерии равенства для объектов, что особенно важно при работе с коллекциями, которые полагаются на эти методы для определения уникальности объектов.

April 26, 2024, easyoffer

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы