我在 METANIT 上遇到了这样一个不寻常的代码。结构声明:
public struct S : IDisposable
{
private bool dispose;
public void Dispose()
{
dispose = true;
}
public bool GetDispose()
{
return dispose;
}
}
并且有这段代码使用它:
var s = new S();
using (s)
{
Console.WriteLine(s.GetDispose());
}
Console.WriteLine(s.GetDispose());
代码输出false, false,虽然它看起来应该输出false, true。最有趣的是,如果将结构S做成一个类,那么就会显示预期值:)
用变量解释幕后发生了s什么?为什么它会是一个结构false, false和一个类 -false, true
您的代码
using展开如下:using不会调用Dispose你的变量s,而是调用它自己的变量。因此,该字段dispose不会在变量处更新s。例如,考虑以下代码:
在这种情况下
s.Mark = 42;,c2 = new C { Mark = 42 };块内的变量分配using不会影响Mark方法显示的字段的值Dispose,因为它using调用Dispose自己的变量。编译器甚至会显示适当的警告。在 c 的情况下
c1.Mark = 42;,变量没有改变,但它指向的对象改变了。