微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么在使用块和对象初始化器的情况下不调用 Dispose

如何解决为什么在使用块和对象初始化器的情况下不调用 Dispose

为什么在使用对象初始值设定项时不调用 dispose()? 我有以下代码

public sealed class MydisposeClass : Idisposable
{
    private int _value;

    public MydisposeClass(string str)
    {
        Console.WriteLine($"MydisposeClass: {str}");
    }

    public int Value
    {
        get => _value;
        set => _value = value / 0;
    }

    public void dispose()
    {
        Console.WriteLine("dispose");
    }
}

public static class MyProgram
{
    public static void Go()
    {
        Console.WriteLine("BEFORE USING");
        using (new MydisposeClass("message") { Value = 100 })
        {
            Console.WriteLine("INSIDE USING");
        }

        Console.WriteLine("AFTER USING");
    }
}

class Program
{
    static void Main()
    {
        MyProgram.Go();
        Console.ReadKey();
    }
}

IlSpy 向我展示了这个:

public static void Go()
{
    Console.WriteLine("BEFORE USING");
    using (new MydisposeClass("message")
    {
        Value = 100
    })
    {
        Console.WriteLine("INSIDE USING");
    }
    Console.WriteLine("AFTER USING");
}

和 ILCode:

// [29 9 - 29 10]
IL_0000: nop

// [30 13 - 30 47]
IL_0001: ldstr        "BEFORE USING"
IL_0006: call         void [mscorlib]System.Console::WriteLine(string)
IL_000b: nop

// [31 13 - 31 66]
IL_000c: ldstr        "message"
IL_0011: newobj       instance void ClassLibrary1.MydisposeClass::.ctor(string)
IL_0016: dup
IL_0017: ldc.i4.s     100 // 0x64
IL_0019: callvirt     instance void ClassLibrary1.MydisposeClass::set_Value(int32)
IL_001e: nop
IL_001f: stloc.0      // V_0
.try
{

  // [32 13 - 32 14]
  IL_0020: nop

  // [33 17 - 33 51]
  IL_0021: ldstr        "INSIDE USING"
  IL_0026: call         void [mscorlib]System.Console::WriteLine(string)
  IL_002b: nop

  // [34 13 - 34 14]
  IL_002c: nop
  IL_002d: leave.s      IL_003a
} // end of .try
finally
{

  IL_002f: ldloc.0      // V_0
  IL_0030: brfalse.s    IL_0039
  IL_0032: ldloc.0      // V_0
  IL_0033: callvirt     instance void [mscorlib]System.Idisposable::dispose()
  IL_0038: nop

  IL_0039: endfinally
} // end of finally

// [35 13 - 35 46]
IL_003a: ldstr        "AFTER USING"
IL_003f: call         void [mscorlib]System.Console::WriteLine(string)
IL_0044: nop

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。