Одно естественное предположение состоит в том, что вы всегда можете вызвать Dispose
для объекта, и это очистит ресурсы объекта, независимо от того, в каком состоянии находится объект.
Это естественное предположение не всегда является правильным.
Пример: клиентские прокси WCF. .
Правильный способ управления временем жизни прокси-сервера выглядит следующим образом:
var serviceClient = new sandbox.SandboxServiceClient();
serviceClient.HelloWorld(name);
if(serviceClient.State == CommunicationState.Faulted)
{
serviceClient.Abort();
}
else
{
serviceClient.Dispose();
}
Переключение на синтаксис using
приведет к небезопасному коду:
using (var serviceClient = new sandbox.SandboxServiceClient())
{
serviceClient.HelloWorld(name);
} // Here An exception will be thrown if the channel has faulted
Вы можете утверждать (, как мы все делаем ), что это ошибочный аспект проектирования WCF, но реальность программирования заключается в том, что нам иногда приходится изменять наш стиль, чтобы приспособить используемые нами фреймворки , Вот пример, где общее правило против явного Dispose
не может применяться, даже если время жизни объекта содержится в одном вызове функции.