1

そのため、私はしばらくの間、をSystem.Net.Mail.MailMessage介して電子メールを送信するためのオブジェクトを使用しています。を実装SmtpClientしているところに気づいたので、常にブロック内で使用しています。MailMessageIDisposableusing

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です。

添付ファイルのファイルハンドルを保持している可能性があるためでしょうか?他に忘れているものはありますか?

4

5 に答える 5

16

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();
}
于 2011-12-13T23:09:58.683 に答える
7

IDisposableを実装する子があるため、IDisposableを実装します。たとえば、添付ファイルはストリームである可能性があるため、添付ファイルは使い捨てのオブジェクトであり、ほとんどの場合、破棄する必要があります。したがって、メッセージが送信された後、添付ファイル(ストリームを保持している)を破棄するには、メッセージを破棄する必要があります。

于 2011-12-13T23:08:42.000 に答える
5

タイプには、MailMessageそれが所有し、を実装するいくつかのフィールドがありますIDisposable。パターンを適切に実装するには、それらのフィールドへの呼び出しIDisposableも実装IDisposableおよびチェーンする必要があります。特に、添付ファイル、ビュー、およびボディビュー

于 2011-12-13T23:10:18.673 に答える
4

画像や添付ファイルを提供する場合は、廃棄時にクリーンアップする必要があります。そのため、使用中に暗黙的にまたは明示的にdisposeを呼び出すことは、実行する必要があることです。

一般に、IDisposableを実装するオブジェクトでは常にdisposeを呼び出します。それが必要でなければ、彼らはそれを実装しなかっただろう。

于 2011-12-13T23:09:05.853 に答える
0

元のソースコードを表示して、現在の動作を正確に確認できます。MailMessage.Disposeを参照してください。許可されているかどうかわからないため、ここにはソースコードを含めていません。

于 2014-07-31T00:13:58.780 に答える