c#结构怪异行为
发现一些带有c#struct和using语句的奇怪behevior。不知道为什么会这样。 示例结构:c#结构怪异行为,c#,.net-core,struct,idisposable,C#,.net Core,Struct,Idisposable,发现一些带有c#struct和using语句的奇怪behevior。不知道为什么会这样。 示例结构: public struct Thing : IDisposable { private bool _dispose; public void Dispose() { _dispose = true; } public bool GetDispose() { return _dispose; } public voi
public struct Thing : IDisposable {
private bool _dispose;
public void Dispose() {
_dispose = true;
}
public bool GetDispose() {
return _dispose;
}
public void SetDispose(bool dispose) {
_dispose = dispose;
}
}
以及此结构的用法:
var thing = new Thing();
using (thing) {
Console.WriteLine(thing.GetDispose());
}
Console.WriteLine(thing.GetDispose());
我希望在这里看到以下输出:
False
True
因为Dispose()方法是在使用范围结束时调用的。
但我得到:
False
False
如果我将struct更改为class,或者使用struct并添加thing.SetDispose(true);在使用范围内,我得到了预期的输出
False
True
我的问题是为什么我在结构中得到False?
我使用调试器检查过,每次使用范围结束时都会调用Dispose()。结构是值类型,因此在这段代码中,原始结构将复制到using语句中的新结构 最后的代码将转换为:
var thing = new Thing(); //thing._dispose == false
using (Thing thing2 = thing) { //thing2.dispose == false
Console.WriteLine(thing2.GetDispose()); //thing2.dispose == false
} //thing2.dispose == true
//BUT thing1.dispose == false
Console.WriteLine(thing.GetDispose());
您可以在此处阅读更多内容:如果您想查看生成的IL@pm100v当struct->class时,奇怪而微妙的代码更改。寻呼Skeetw先生为什么不使用属性作为“_dispose”?