为啥我需要 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() 会导致编译错误?

为啥是 IDisposable 接口? [复制]

既然 .NET 有一个垃圾收集器,为啥我们需要终结器/析构器/处置模式?

C# IDisposable 类,正确使用 Dispose,获取错误“dispose”需要 1 个参数