2012-06-18 1 views
1

Я заметил, что большая часть кода примера, использующего класс .NET SmtpClient, не удаляет созданный объект или не переносит его в блок использования. (например, http://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient.aspx) Является ли диспетчер SmtpClient необязательным или не очень важным или примеры приводят нас к неправильному пути? Примечание. В приведенном выше примере MSDN MailMessage расположен, но не объект SmtpClient.с использованием SmtpClient и IDisposable

ответ

2

Причина, по которой множество примеров в Интернете не показывает правильный код утилизации, заключается в том, что SmtpClient didn't implement IDisposable until .NET 4. Таким образом, примеры могут быть основаны на предыдущей структуре или написаны кем-то, незнакомым с новой функциональностью.

0

Примеры Msdn опускают такие вещи, потому что необходимо четко продемонстрировать концепцию в небольшой сфокусированной статье, а не писать правильное надежное производственное приложение.

+0

Если вы ткнете, это не только примеры MSDN. Я также считаю, что это плохая концепция, поскольку многие (большинство?) Будут следовать примерам дословно. – kenny

1

Вы должны утилизировать его.

В этом примере они используют SendAsync(), поэтому они не используют ключевое слово «using» - SendAsync() немедленно возвращается, и вы можете попытаться удалить объект, который в настоящее время используется. Однако лучше всего распоряжаться клиентом, когда все асинхронные методы выполняются.

+0

Я действительно должен научиться типичной быстрее: P Exaclty, если вы посмотрите документацию «Dispose()», вы увидите, что она будет прокручивать запрос, если его вызвали раньше. (Возможно) Они пропустили «sender.Dispose()» в конце обработчика async. Но я думаю, что Garbagecollector сможет справиться с этим. –

+2

Курс GC справится с этим, но причиной реализации IDisposable является возможность размещения объектов на ранней стадии, прежде чем сбор мусора, чтобы освободить некоторую ОС или внешние ресурсы. –