为啥我需要 Dispose 一个 System.Net.Mail.MailMessage 实例?
Posted
技术标签:
【中文标题】为啥我需要 Dispose 一个 System.Net.Mail.MailMessage 实例?【英文标题】:Why do I need to Dispose a System.Net.Mail.MailMessage instance?为什么我需要 Dispose 一个 System.Net.Mail.MailMessage 实例? 【发布时间】:2012-01-18 15:37:10 【问题描述】:它分配了哪些需要处置的非托管资源?它不只是一个简单的托管数据数组吗?那为什么要处理呢?
【问题讨论】:
因为它实现了 IDisposable :) @csharptest.net 这不是原因。 @Ci3 是!如果某物实现了 IDisposable,则其 API 要求处置。如果你不处理,可能会发生一些不好的事情。例外可能存在,但它们是例外。 @Raphael 我理解如果对象实现了该类,您为什么应该处置对象,但评论只是实现细节。它没有解释该类中的非托管数据是什么。 @Ci3 同意!但由于它只是一个评论,所以我想没关系(如果它是一个答案,我不会接受它:))。 【参考方案1】:MailMessage 可以有附件,附件由 MIME 部分表示,该部分本身包含一个 Stream。此 Stream 需要关闭,因为它可能包含指向底层数据的非托管指针。
【讨论】:
【参考方案2】:一封邮件有附件 -> 附件是流 -> 流将被处理。
这里是MailMessage的反编译Dispose方法:
protected virtual void Dispose(bool disposing)
if (disposing && !this.disposed)
this.disposed = true;
if (this.views != null)
this.views.Dispose();
if (this.attachments != null)
this.attachments.Dispose();
if (this.bodyView != null)
this.bodyView.Dispose();
作为一般规则,一个类应该实现 IDisposable,如果它包含的任何子级实现它。
【讨论】:
这是否意味着如果邮件没有任何附件,则不需要处理? @Raphael 如果某些东西实现了 IDisposable,您应该将其丢弃。您还可以看到它还处理了其他东西。 每条规则都有其exceptions,但这不是例外之一。以上是关于为啥我需要 Dispose 一个 System.Net.Mail.MailMessage 实例?的主要内容,如果未能解决你的问题,请参考以下文章
为啥即使服务仍然引用它,也会在 DataContract 上调用 Dispose?
为啥在 Graphics 对象上调用 dispose() 会导致 JPanel 不呈现任何组件
为啥在 BinaryReader 上调用 Dispose() 会导致编译错误?