在 Class 属性 中使用 MemoryStream 和 IDisposable

Using in Class Property MemoryStream and IDisposable

我正在使用 openxml 创建 excel 和 powerpoint 文档。 因为我不想创建空文件,所以我想确保只在文档完成时使用我自己的 Save 方法编写文档。效果很好。

不过,在开发过程中,当它崩溃时,通常会暂时阻塞DLL文件。我在想 IDisposable 没有被正确调用。有没有办法在我的 class 属性 _MemStream 中定义 using?

public partial class Presentation
{
  public Pa.PresentationDocument PresentationDoc { get; set; }   //PresentationPart parts
  private MemoryStream _MemStream { get; set; }

  public void Init(string FileName = "NoName")
  {
    //Init stream
    this._MemStream = new MemoryStream();
    this.PresentationDoc = Pa.PresentationDocument.Create(
    this._MemStream, PresentationDocumentType.Presentation);
    // Create the presentation
  }
  public string Save(string path)
  {
    this.PresentationDoc.Close();
    using (FileStream fileStream = new FileStream(FileTemp,
    System.IO.FileMode.CreateNew))
    {
      this._MemStream.WriteTo(fileStream);
    }

    this._MemStream.Flush();
  }
}

Dispose 方法未被魔法调用。如果您的 class 创建一次性成员,那么 class 本身应该实现 IDisposable 接口并调用这些成员的 Dispose 方法。如果 class 在方法范围内创建一次性实例,这些实例应调用 Dispose 方法。

因此 Presentation 应该实现 IDisposable 接口,您可以在其中配置 _MemStream 和可能的接口。

使用 Presentation class 的客户端应该调用 Dispose 方法,框架不会为我们做这个。

正如 Adrian 所说,事物不会被魔法处置。因此,开始处理的一种方法是让 Presentation 实现 IDisposable 本身,然后在那里处理你的资源。

例如:

public partial class Presentation : IDisposable
{
  public Pa.PresentationDocument PresentationDoc { get; set; }   //PresentationPart parts
  private MemoryStream _MemStream { get; set; }

  public void Init(string FileName = "NoName")
  {
    //Init stream
    this._MemStream = new MemoryStream();
    this.PresentationDoc = Pa.PresentationDocument.Create(
      this._MemStream, PresentationDocumentType.Presentation);
    // Create the presentation
  }
  public string Save(string path)
  {
    this.PresentationDoc.Close();
    using (FileStream fileStream = new FileStream(FileTemp,
      System.IO.FileMode.CreateNew))
    {
      this._MemStream.WriteTo(fileStream);
    }

    this._MemStream.Flush();
  }

  public void Dispose()
  {
    if(_MemStream != null)
    {
      _MemStream.Dispose();
    }
  }
}