Почему System.Net.Mail.MailMessage реализует IDisposable - PullRequest
0 голосов
/ 14 декабря 2011

Итак, я уже некоторое время использую System.Net.Mail.MailMessage объекты для отправки электронной почты через SmtpClient. Я где-то заметил, что MailMessage реализует IDisposable, поэтому я всегда использую его в блоке using.

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 обрабатывает все это.

Может ли это быть из-за возможного хранения файловых дескрипторов для вложенных файлов? Есть ли что-то еще, о чем я забыл?

Ответы [ 5 ]

15 голосов
/ 14 декабря 2011

Согласно 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 голосов
/ 14 декабря 2011

Он реализует IDisposable, потому что у него есть дочерние элементы, которые реализуют IDisposable.Например, Attachment - это одноразовый объект, потому что вложением может быть Stream, который большую часть времени необходимо удалить.Таким образом, после того, как сообщение было отправлено, удаление сообщения требуется для удаления вложения (которое содержит поток).

5 голосов
/ 14 декабря 2011

Тип MailMessage имеет несколько полей, которыми он владеет и которые реализуют IDisposable. Правильная реализация шаблона IDisposable требует, чтобы он также реализовывал IDisposable и связывал вызов с этими полями. В частности вложения, представления и представление тела

4 голосов
/ 14 декабря 2011

Если вы предоставляете изображения или вложения, их необходимо очистить при утилизации.Таким образом, вызов dispose либо неявно в использовании, либо в явном виде - это то, что вы должны делать.

В общем, всегда вызывайте dispose для любого объекта, который реализует IDisposable.Они бы не реализовали это, если бы в этом не было необходимости.

0 голосов
/ 31 июля 2014

Вы можете просмотреть исходный код, чтобы увидеть, что именно он делает в данный момент. См. MailMessage.Dispose . Я не включил сюда исходный код, потому что не знаю, разрешен ли он.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...