Назад к вопросам
Middle
289
questionbank

Что именно мы сравниваем, когда работаем с ссылочными типами в C#?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

При сравнении ссылочных типов в C# по умолчанию сравниваются ссылки на объекты в памяти, а не содержимое самих объектов.

Это означает, что object1 == object2 будет истинно только в том случае, если object1 и object2 указывают на один и тот же экземпляр в куче.

Для сравнения содержимого объектов ссылочных типов используются:

  • Переопределение метода Object.Equals().
  • Реализация интерфейса IEquatable<T>.
  • Использование статического метода Object.Equals().
  • Использование статического метода Object.ReferenceEquals().
// Пример сравнения ссылок
string s1 = "hello";
string s2 = "hello";
string s3 = s1;

Console.WriteLine(s1 == s2); // Может быть true из-за интернирования строк
Console.WriteLine(object.ReferenceEquals(s1, s2)); // Чаще всего false (разные экземпляры)
Console.WriteLine(s1 == s3); // true (одна и та же ссылка)
Console.WriteLine(object.ReferenceEquals(s1, s3)); // true (одна и та же ссылка)

// Пример сравнения содержимого
class MyClass : IEquatable<MyClass>
{
    public int Value { get; set; }

    public override bool Equals(object obj)
    {
        return Equals(obj as MyClass);
    }

    public bool Equals(MyClass other)
    {
        if (other == null)
            return false;
        return Value == other.Value;
    }

    public override int GetHashCode()
    {
        return Value.GetHashCode();
    }
}

MyClass mc1 = new MyClass { Value = 10 };
MyClass mc2 = new MyClass { Value = 10 };
MyClass mc3 = mc1;

Console.WriteLine(mc1 == mc2); // false (разные ссылки)
Console.WriteLine(mc1.Equals(mc2)); // true (сравниваем содержимое)
Console.WriteLine(object.Equals(mc1, mc2)); // true (сравниваем содержимое)
Console.WriteLine(object.ReferenceEquals(mc1, mc3)); // true (одна и та же ссылка)