Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#结构怪异行为_C#_.net Core_Struct_Idisposable - Fatal编程技术网

c#结构怪异行为

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

发现一些带有c#struct和using语句的奇怪behevior。不知道为什么会这样。 示例结构:

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”?