Struct S реализует IDisposable. Что выведет GetDispose() внутри и после блока using(s), если Dispose меняет поле dispose?
C# / .NET
Основы языка
Junior
Что это: Для value type блок using работает с копией struct: Dispose вызывается на копии, а исходная переменная s не меняется. Оба вызова GetDispose() вернут false.
Почему важно: Показывает разницу между using для class и struct и объясняет, почему IDisposable на struct часто реализуют через ref struct или class-обёртку.
Под капотом: Компилятор разворачивает using в try/finally с вызовом Dispose на локальной копии struct. Без ref using изменения в Dispose не попадают в исходную переменную на стеке.
Типичная ошибка: Ожидать true после using для struct, как для reference type, где Dispose меняет состояние того же объекта в куче.
public struct S : IDisposable
{
private bool dispose;
public void Dispose() => dispose = true;
public bool GetDispose() => dispose;
}
var s = new S();
using (s) { Console.WriteLine(s.GetDispose()); }
Console.WriteLine(s.GetDispose());