繁体   English   中英

处理类。 我需要吗?

[英]Dispose Class. Do I need it?

我有以下邮件类:

public class Mail {
  public List<MailFile> Files { get; set; }
  public String Text { get; set; }
  // Other properties
}

public class MailFile {
  public Byte[] Data { get; set; }
  public String Mime { get; set; }
  public String Name { get; set; }
} // MailFile

邮件包含文件列表,其中每个MailFile包含属性Data,该属性包含File二进制数据。 然后,我使用Mailer发送电子邮件。

public class Mailer : IMailer {

  private SmtpClient _client;

  public Mailer() {
    _client = new SmtpClient { UseDefaultCredentials = true };
  } // Mailer

  public void Send(Mail mail) {

    using (MailMessage message = new MailMessage()) {
      message.Text = mail.Text);
      // Define other fields
      foreach (MailFile file in mail.Files)
        message.Attachments.Add(new Attachment(new MemoryStream(x.Data), x.Name, x.Mime)));

      _client.Send(message);

    };

  } // Send

  public void Dispose() {
    Dispose(true);
  } // Dispose

  protected virtual void Dispose(Boolean disposing) {
    if (disposing) {
      if (_client != null)
        _client.Dispose();
    }
  } // Dispose

} // Mailer

我在using包装MailMessage

  • 但是在这种情况下,我是否需要处置邮件文件?
  • 我的邮件和邮件文件不是由GC管理和处置的吗?
  • 也许我应该将Mail丢弃并处置其MailFiles?
  • 如果是,最好的方法是什么?

使用using关键字时,需要实现IDisposable 资料来源: MSDN

using语句允许程序员指定使用资源的对象何时释放它们。 提供给using语句的对象必须实现IDisposable接口。 该接口提供Dispose方法,该方法应释放对象的资源。

要回答您的特定问题,我们需要查看更多代码。

如果您的MailMessage类包含任何非托管资源或流,则绝对必须释放实现IDisposable并从代码中调用Dispose()方法的资源。

如果要将它们包装在using语句中,则该类需要实现IDisposable。 如果不这样做,它甚至不会编译。

如果未管理内存,则可能只需要释放内存即可,但是将内部托管引用设置为null应该可以满足您的需要。

要回答您的特定问题:

  • 但是在这种情况下,我是否需要处置邮件文件?

我认为您不需要,但这不会造成伤害,并且可以使GC清楚地知道,对对象的引用较少。 如果您有类似以下内容:

String name;
using(MailFile mf = ...) {
    name = mf.Name;
}

// do something with name

您仍然持有对实际字符串的引用,因此不会得到GC。 MF应该,但是不能保证什么时候。

  • 我的邮件和邮件文件不是由GC管理和处置的吗?

是的,但是只要在某个地方保留了对该对象的引用,它们就不会存在。 如果将其设置为null,而没有其他引用内存中的实际对象,则意味着GC最终将对其进行清理,但不能保证何时发生。

  • 也许我应该将Mail丢弃并处置其MailFiles?

通常不需要,但是是个好主意。 只需使其实现IDisposable并在处理时将字段设置为null。

  • 如果是,最好的方法是什么?

参见上一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM