var s = new S();

Программа выведет False дважды. В using (s) структура копируется во временную переменную ресурса, и Dispose изменяет эту копию, а не исходную s.

Короткий ответ

Что ответить на собеседовании

Программа выведет False дважды. В using (s) структура копируется во временную переменную ресурса, и Dispose изменяет эту копию, а не исходную s.

Подробный разбор

Ответ с пояснениями

Условие

var s = new S();

using (s) { Console.WriteLine(s.GetDispose()); } Console.WriteLine(s.GetDispose());

public struct S : IDisposable { private bool dispose;

public void Dispose()
{
    dispose = true;
}

public bool GetDispose()
{
    return dispose;
}

}

Что будет в stdout?

Ответ

Программа выведет False дважды. В using (s) структура копируется во временную переменную ресурса, и Dispose изменяет эту копию, а не исходную s.

В теле блока GetDispose вызывается у исходной s, где dispose изначально false. При выходе using вызывает Dispose у своей копии структуры. Затем исходная переменная снова возвращает false.

Это следствие value semantics, а не обязательного boxing: компилятор может вызвать IDisposable.Dispose для структуры без упаковки. Если заменить S классом, копируется ссылка на тот же объект, и второй вывод станет True. Изменяемые disposable-структуры требуют особой осторожности.

Источник: learn.microsoft.com.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее