Выбор ответа Junior Типы значений и ссылочные спрашивают часто обновлено

Переприсваивание параметра-класса

Вопрос

Что выведет код?

class Person { public string Name; public Person(string n) => Name = n; }

static void Rename(Person p) { p = new Person("Борис"); }

var person = new Person("Анна");
Rename(person);
Console.WriteLine(person.Name);

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Анна. Ссылка на объект передаётся по значению: метод получает копию ссылки. p = new Person(...) меняет только локальную копию, исходная переменная по-прежнему указывает на объект с именем Анна.

Варианты ответа

  1. Борис
  2. Аннаправильный ответ
  3. null
  4. Ошибка компиляции

Разбор

Ссылка на объект передаётся по значению: метод получает копию ссылки. p = new Person(...) меняет только локальную копию, исходная переменная по-прежнему указывает на объект с именем Анна. Если бы метод сделал p.Name = "Борис", изменился бы общий объект. Чтобы заменить сам объект у вызывающего, нужен ref Person p.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме