为什么System.Net.Mail.MailMessage实现IDisposable

时间:2011-12-13 23:03:43

标签: .net idisposable mailmessage

所以我一直在使用System.Net.Mail.MailMessage个对象通过SmtpClient发送电子邮件一段时间了。我注意到MailMessage实现IDisposable的地方,所以我总是在using块中使用它。

using(MailMessage msg = new MailMessage())
{
    msg.To = blah... etc;
    ...
    smtpclient.Send(msg);
}

从元数据中,您可以看到有关MailMessage

实施的此信息
// Summary:
//     Releases all resources used by the System.Net.Mail.MailMessage.
[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
public void Dispose();
//
// Summary:
//     Releases the unmanaged resources used by the System.Net.Mail.MailMessage
//     and optionally releases the managed resources.
//
// Parameters:
//   disposing:
//     true to release both managed and unmanaged resources; false to release only
//     unmanaged resources.
protected virtual void Dispose(bool disposing);

但我想知道,为什么MailMessage实施IDisposable?它似乎与网络相关的项目无关,因为SmtpClient处理所有这些。

可能是由于可能持有附加文件的文件句柄吗?那里还有别的东西我忘记了吗?

5 个答案:

答案 0 :(得分:15)

根据dotPeek的说法,它正在处理它的附件及其观点:

protected virtual void Dispose(bool disposing)
{
  if (!disposing || this.disposed)
    return;
  this.disposed = true;
  if (this.views != null)
    this.views.Dispose();
  if (this.attachments != null)
    this.attachments.Dispose();
  if (this.bodyView == null)
    return;
  this.bodyView.Dispose();
}

答案 1 :(得分:7)

它实现了IDisposable,因为它有子实现IDisposable。例如,附件是一次性物体,因为附件可以是流,大多数时候需要处理。因此,在发送消息后,处理附件(包含流)需要处理消息。

答案 2 :(得分:5)

MailMessage类型有几个字段,它拥有并实现IDisposable。正确实现IDisposable模式要求它还实现IDisposable并将调用链接到这些字段。特别是附件,视图和正文视图

答案 3 :(得分:4)

如果您提供图像或附件,则需要清理这些图像或附件。因此,在使用或显式中隐式调用dispose是你应该做的事情。

通常,总是在实现IDisposable的任何对象上调用dispose。如果没有必要,他们就不会实施它。

答案 4 :(得分:0)

您可以查看原始源代码,以确切了解它当前的功能。见MailMessage.Dispose。我没有在这里包含源代码,因为我不知道是否允许它。