首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用语句扩展的奇怪的C#

使用语句扩展的奇怪的C#
EN

Stack Overflow用户
提问于 2009-06-03 20:23:00
回答 5查看 3.6K关注 0票数 26

我已经运行ildasm找到了这个:

代码语言:javascript
复制
    using(Simple simp = new Simple())
    {
        Console.WriteLine("here");
    }

生成等同于以下内容的IL代码:

代码语言:javascript
复制
    Simple simp = new Simple();
    try
    {
        Console.WriteLine("here");
    }
    finally
    {
        if(simp != null)
        {
            simp.Dispose();
        }
    }

问题是,为什么它会在最后检查null呢?finally块仅在try块被执行时执行,try块仅在简单构造函数成功(即不抛出异常)时才执行,在这种情况下,simp将为非空。(如果有人担心在简单构造函数和try块的开头之间可能会出现一些干预步骤,那么这将是一个真正的问题,因为这样可能会抛出一个异常,从而完全阻止finally块的执行。)那么,为什么见鬼呢?

把using语句是否比try-finally更好的争论放在一边,我把try-finally块写成:

代码语言:javascript
复制
    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
    }
EN

回答 5

Stack Overflow用户

发布于 2009-06-03 20:25:14

不,finally块将始终被执行。您可能不是从新的函数中获取对象,而是从返回您的对象的其他函数中获取对象-它可能会返回NULL。使用()是您的朋友!

dss539很客气地建议我加上他的笔记:

代码语言:javascript
复制
using(Simple simp = null) 

是扩展必须首先检查null的另一个原因。

票数 22
EN

Stack Overflow用户

发布于 2009-06-03 20:31:16

using(Simple simp = null)仍然是的另一个原因,即扩展必须首先检查null。

票数 11
EN

Stack Overflow用户

发布于 2009-06-03 21:04:33

using语句上的MSDN

我觉得奇怪的是,它并没有扩展到:

代码语言:javascript
复制
Simple simp = new Simple();
Simple __compilergeneratedtmpname = simp;
try
{
    Console.WriteLine("here");
}
finally
{
    if(__compilergeneratedtmpname != null)
    {
        __compilergeneratedtmpname.Dispose();
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/946999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档