【发布时间】:2012-06-25 15:34:53
【问题描述】:
我有以下代码,它使用流打开和修改 Open XML 文档,然后保存该流的新二进制表示:
MemoryStream stream = null;
try
{
stream = new MemoryStream();
stream.Write(this.GetBinaryRepresentation(), 0, this.GetBinaryRepresentation().Length);
using (WordprocessingDocument document = WordprocessingDocument.Open(stream, true))
{
OfficeDocument.ModifyDocument(document);
this.SetBinaryRepresentation(stream.ToArray());
stream = null;
}
}
finally
{
if (stream != null)
{
stream.Dispose();
}
}
我最初使用了两个 using 块(一个用于 MemoryStream,第二个用于 WordprocessingDocument),但收到警告 CA2202:“对象'流'可以在方法中多次处理...”根据MSDN article ,我将代码修改为上面的代码(将外部使用转换为尝试),但我仍然收到此警告。
我不确定如何构建此方法以确保 Dispose 在流中仅被调用一次。我不想简单地取消这个警告,因为 MSDN 文章指出你不应该依赖 Dispose 可以安全地多次调用。
【问题讨论】:
-
只是一个评论:当你在 using 块中为空引用时,你将如何在流上调用
Dispose? -
@BrianRasmussen - 考虑 stream.Write 抛出异常。在这种情况下,流未设置为 null 并被放置在 finally 块中。
-
@Henrik: 当然可以,但是在成功的情况下,我看不到
Dispose是如何被调用的。 -
流由文档周围的 using 语句处理。当它超出范围时,将调用 document.Dispose(),它本身会处理任何底层资源,包括传入的流。
-
@JonSenchyna 啊,我不知道 WordprocessingDocument 类,所以我不知道它是否也处理流。感谢您的澄清。