Изменится ли существующий объект класса, если переменной присвоить новое значение?

«Изменится ли существующий объект класса, если переменной присвоить новое значение?» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, сам объект в управляемой куче не изменится. В C# переменная для ссылочного типа (класса) хранит не сам объект, а ссылку (адрес) на него. Присваивание нового значения переменной меняет эту ссылку, оставляя исходный объект нетронутым (если на него больше не осталось других ссылок).

Пример, демонстрирующий разницу:

public class Person
{
    public string Name { get; set; }
}

// Создаём объект и две ссылки на него
Person personA = new Person { Name = "Alice" };
Person personB = personA; // personB ссылается на ТОТ ЖЕ объект, что и personA

// 1. Изменение состояния через одну ссылку влияет на объект, видимый по другой
personB.Name = "Bob";
Console.WriteLine(personA.Name); // Вывод: "Bob"
// Объект изменён, обе переменные по-прежнему указывают на него.

// 2. Перенаправление ссылки на новый объект
personA = new Person { Name = "Charlie" };
Console.WriteLine(personA.Name); // Вывод: "Charlie" (новый объект)
Console.WriteLine(personB.Name); // Вывод: "Bob" (старый объект)
// Исходный объект (с Name="Bob") остался в памяти, и на него всё ещё ссылается personB.
// Переменная personA теперь ссылается на совершенно другой объект.

Ключевой вывод: Присваивание (=) для ссылочных типов меняет, на какой объект ссылается переменная, а не содержимое самого объекта. Чтобы изменить существующий объект, нужно работать с его полями или свойствами через оставшуюся ссылку.