Программа выведет False дважды. В using (s) структура копируется во временную переменную ресурса, и Dispose изменяет эту копию, а не исходную s.
var s = new 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.