Назад к вопросам
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 (одна и та же ссылка)