小编Mat*_*hew的帖子

好奇的C#使用语句扩展

我跑ildasm发现这个:

    using(Simple simp = new Simple())
    {
        Console.WriteLine("here");
    }
Run Code Online (Sandbox Code Playgroud)

生成与此等效的IL代码:

    Simple simp = new Simple();
    try
    {
        Console.WriteLine("here");
    }
    finally
    {
        if(simp != null)
        {
            simp.Dispose();
        }
    }
Run Code Online (Sandbox Code Playgroud)

而问题是为什么它会在最后检查null?只有在执行try块时才会执行finally块,并且只有在Simple构造函数成功时才会执行try块(即不抛出异常),在这种情况下simp将为非null.(如果担心在Simple构造函数和try块的开头之间可能会出现一些干预步骤,那么这确实是一个问题,因为可能会抛出一个异常,阻止finally块执行.)那么,为什么地狱?

暂且不谈(请)使用声明是否比try-finally更好的论点,我将try-finally块写成:

    Simple simp = new Simple();
    try
    {
        Console.WriteLine("here");
    }
    finally
    {
        simp.Dispose();
        simp = null;        // sanity-check in case I touch simp again
                            // because I don't rely on all classes
                            // necessarily throwing
                            // ObjectDisposedException
    }
Run Code Online (Sandbox Code Playgroud)

c# using finally try-catch expansion

26
推荐指数
2
解决办法
3385
查看次数

标签 统计

c# ×1

expansion ×1

finally ×1

try-catch ×1

using ×1