2011-12-13 81 views
1

因此,我一直在使用System.Net.Mail.MailMessage對象通過SmtpClient發送電子郵件一段時間。我注意到MailMessage實現了IDisposable,所以我總是在using塊中使用它。爲什麼System.Net.Mail.MailMessage實現IDisposable

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處理所有這些。

它可能是由於可能保存附件的文件句柄?我忘了還有什麼嗎?

+2

附件需要關閉,一個。 – 2011-12-13 23:05:50

回答

14

據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(); 
} 
7

它實現了IDisposable,因爲它的子項實現了IDisposable。例如,附件是一個可丟棄的對象,因爲附件可以是一個流,大部分時間需要處理。因此,在消息發送後,處理附件(持有流)需要處理該消息。

4

如果您提供圖像或附件,那麼需要在處理時對其進行清理。因此,調用或者隱式地使用或者明確地是你應該做的事情。

通常,在任何實現IDisposable的對象上總是調用dispose。如果沒有必要,他們不會實施它。

+0

當我讀到「如果沒有必要時他們不會實現它」,我幾乎停止了點擊upvote,因爲作爲一個例子,我讀過的所有內容都說Linq to SQL沒有必要DataContext對象。還有一些ASP.NET MVC Helpers使用它作爲一些語法工具,但並不是必要的;如`Html.BeginForm`返回的對象;當Disposed輸出表單的結尾時,它所做的全部工作。無論如何,一般好的建議+1。 – 2011-12-13 23:12:08

+1

@AndrewBarber - 按照這個定義,調用dispose從不「必要」,因爲GC最終會調用它。然而,我應該說的是「非常渴望」,因爲人們永遠不知道什麼時候Dispose最終會被調用。 – 2011-12-13 23:19:35

5

MailMessage類型有幾個領域,它擁有和實現IDisposable。正確實施IDisposable模式需要它也實現IDisposable並將呼叫鏈接到這些字段。特別是附件,視圖和正文視圖

0

您可以查看原始源代碼以準確查看它當前的功能。見MailMessage.Dispose。我沒有在這裏包含源代碼,因爲我不知道它是否被允許。

相關問題