Я бы сказал, всегда используйте using
, если документация не говорит вам (как в вашем примере).
Наличие метода Dispose
для исключения исключений скорее лишает смысла использовать его (каламбур). Всякий раз, когда я его реализую, я всегда стараюсь убедиться, что из него не будут выброшены исключения, независимо от того, в каком состоянии находится объект.
PS: вот простой служебный метод для компенсации поведения WCF. Это гарантирует, что Abort
вызывается в каждом пути выполнения, отличном от того, когда вызывается Close
, и что ошибки распространяются до вызывающей стороны.
public static void CallSafely<T>(ChannelFactory<T> factory, Action<T> action) where T : class {
var client = (IClientChannel) factory.CreateChannel();
bool success = false;
try {
action((T) client);
client.Close();
success = true;
} finally {
if(!success) {
client.Abort();
}
}
}
Если вы найдете другие забавные случаи поведения в другом месте фреймворка, вы можете придумать похожую стратегию для их обработки.