所以我一直在使用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
处理所有这些。
可能是由于可能持有附加文件的文件句柄吗?那里还有别的东西我忘记了吗?
答案 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。我没有在这里包含源代码,因为我不知道是否允许它。