处理类。我需要它吗?

时间:2013-04-09 17:56:12

标签: c#

我有以下邮件类:

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

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

2 个答案:

答案 0 :(得分:1)

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

  

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

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

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

答案 1 :(得分:0)

如果您要将它们包装在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。

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

见上一点。