在C#或[dispose]方法中使用[using]语句会更好吗?这适用于外部(COM)对象吗?

goo*_*ate 2 .net c# com dispose using-statement

什么是更好的,使用指令,或完成对象时的dispose指令?

 using(FileStream fileStream = new FileStream(
            "logs/myapp.log",
            FileMode.Open,
            FileAccess.Read,
            FileShare.ReadWrite))
        {
            using(StreamReader streamReader = new StreamReader(fileStream))
            {
                this.textBoxLogs.Text = streamReader.ReadToEnd();
            }
        }
Run Code Online (Sandbox Code Playgroud)

另一方面,当我正在处理System.Net.Mail时,我被告知我需要对象的Dispose()来释放任何杂散锁.

有没有一致的指导?如何判断在给定对象的特定情况下哪些更合适?

Hen*_*man 9

using 语句(非指令)涉及对Dispose()finally块的隐式调用.所以这里没有矛盾.你能链接到那个讨论吗?

官方的定义
using (x) { ... }

try ... finally if (x != null) x.Dispose(); }

什么是更好的?

从符号的角度来看,using() { }块.从技术上讲,它们是一样的.

  • @MakerOfThings - COM对象不实现IDisposable,因为IDisposable是.NET接口,而COM不是.NET.如果你直接使用COM对象,你应该尝试`Marshal.ReleaseComObject`来销毁它. (2认同)

Han*_*ant 5

这是同一件事.用法很简单,如果您创建对象并仅在一个方法中使用它,则使用using.如果你需要在方法调用之外保持活着,那么你必须使用Dispose().

COM对象的运行时可调用包装器没有Dispose()方法.

  • @MakerOfThings7:您必须显式释放COM对象可能获得的所有资源.具体如何,取决于您正在处理的COM对象. (2认同)

Rob*_*Rob 5

当你可以在一个块中包装一个对象时Dispose(),除了在另一个实现中Dispose()(例如在你创建的实现的类中IDisposable),我没有理由手动调用using.在使用块使对象的创建和处理在一个try/catch/finally块来几乎 gaurantee该对象将被正确处理.

编译器比我更可靠.或者您.=)

MSDN记录了using语句并调出了可以获取C#语言规范的位置,您可以在其中查看第8.13节"使用语句"(至少在v4.0参考中它是8.13),它给出了using语句的全面解释以及如何使用它.第五段给出以下内容:

使用声明分为三个部分:获取,使用和处置.资源的使用隐式包含在包含finally子句的try语句中.这个finally子句处理资源.如果获取了空资源,则不会调用Dispose,也不会抛出异常.