【问题标题】: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 同意!但由于它只是一个评论,所以我想没关系(如果它是一个答案,我不会接受它:))。

标签: c# email


【解决方案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,但这不是例外之一。
    猜你喜欢
    • 2016-06-25
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 2019-02-17
    • 2011-03-10
    • 1970-01-01
    • 2020-05-05
    相关资源
    最近更新 更多