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

Ответ

Нет, сам объект в управляемой куче не изменится. В 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 теперь ссылается на совершенно другой объект.

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

Ответ 18+ 🔞

А, ну тут классика, блядь, вечный вопрос, который новичков в C# в ступор вгоняет! Смотри, объясню на пальцах, а то голова кругом идёт.

Представь, что у тебя есть квартира (это наш объект в куче). У тебя есть бумажка с её адресом (это переменная 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" (старая хата, в которую ты обои переклеил)

Короче, вывод, блядь, простой до охуения: Знак = для ссылочных типов — это не "изменить объект", а "переприцелиться". Хочешь поменять саму квартиру — лезь внутрь и делай ремонт через свойства. Хочешь начать следить за другой квартирой — вот тогда уже переприцеливайся, пиши новый адрес. Старая квартира (объект) будет висеть в памяти, пока на неё хоть одна бумажка с адресом остаётся.