首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StreamWriter内部处置

StreamWriter内部处置
EN

Stack Overflow用户
提问于 2012-06-29 00:25:20
回答 2查看 311关注 0票数 1

我有以下代码:

代码语言:javascript
复制
        public void Dispose()
        {
            bool append = true;
            using(var log = new System.IO.StreamWriter("log.txt", append))
            {
                log.WriteLine("Disposing");
                log.Flush();
            }
        }

因此存在StreamWriter可能抛出异常的风险,这是否意味着我的对象不会被释放?简单地将其包装在Try/Catch中就能解决问题吗?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-29 00:32:26

这取决于你这样说是什么意思:

这是否意味着我的对象不会被释放?

您的对象已经调用了Dispose,否则它不会到达StreamWriter代码。Dispose调用可能还没有完成,但它不像是在对象上有一些神奇的标志,上面写着“已处置或未处置”。

请注意,处理与垃圾收集和终结在逻辑上是分开的:您的对象仍将以与正常方式相同的方式进行垃圾收集(当没有活动引用时),如果您有终结器(几乎肯定不是一个好主意),如果您没有抑制它,它仍然会被调用。

重要的是要理解,尽管C#在语言级别支持IDisposable,但它实际上并不关心它。它只是另一个接口,而Dispose只是另一个方法。

一般来说,抛出一个异常对Dispose来说不是一个好主意(就像一个对象作为清理现有失败操作的一部分被处理,你最终会丢失原来的异常),但它不会以某种方式从根本上损害CLR。

票数 3
EN

Stack Overflow用户

发布于 2012-06-29 00:33:26

所以StreamWriter可能会抛出异常的风险,这是否意味着我的对象不会被释放呢?简单地将其包装在Try/Catch中就能解决问题吗?

如果StreamWriter抛出异常,唯一副作用就是以下代码将不会执行。

代码语言:javascript
复制
 log.WriteLine("Disposing");
 log.Flush();

Rest一切都会如预期的那样。StreamWriter也将得到适当的处理。(这就是using关键字的用途)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11248937

复制
相关文章

相似问题

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