0

我有以下邮件类:

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

Mail 包含一个文件列表,其中每个 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

我将 MailMessage 包装在using

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

2 回答 2

1

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

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

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

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

于 2013-04-09T18:06:44.467 回答
0

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

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

要回答您的特定问题:

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

我认为您不需要这样做,但这不会造成伤害,并且会让 GC 清楚地知道对对象的引用少了一个。如果你有类似的东西:

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

// do something with name

您仍然持有对实际字符串的引用,因此它不会被 GC 处理。mf 应该,但不能保证何时。

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

是的,但只要对对象的引用保存在某处,它们就不会存在。将其设置为 null 且没有其他内容引用内存中的实际对象,这意味着 GC 最终会清理它,但不能保证它何时会发生。

  • 也许我应该让 Mail 一次性并处理它的 MailFiles?

不是必需的,但一般来说是个好主意。只需让它实现 IDisposable 并在处理时将字段设置为 null 即可。

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

见上一点。

于 2013-04-09T18:01:29.727 回答