Re[7]: using Statement и отложенная инициализация
От: _FRED_ Черногория
Дата: 25.12.08 09:46
Оценка:
Здравствуйте, samius, Вы писали:

_FR>>Если тип d спроектирован правильно, то ничего страшного быть не может, так как по контракту IDisposable:

S>Да, как раз речь о том, что при обращении к правильно спроектированному классу за пределами блока using наверняка завершится исключением ObjectDisposedException. А объявление переменной вне блока using как раз способствует этому.

Да, если есть возможность, всегда надо объевлять переменную как можно "локальнее" и как можно длиже к месту использования.

_FR>>А по-другому иногда не получается: например, прежде чем usaть объяет, надо проверить некоторые условия.

S>Можно вынести код получения объекта и его проверки во вспомогательный метод, обращение к которому сделать из блока using(var d = GetD())

Очень может быть. Какой вариант выглядит лучше и почему:
var d = smth();
if(condition(d)) {
  using(d) {
    //…
  }//using
}//if

или
Func<IDisposable> acquire = () => {
  var x = smth();
  return condition(x) ? x : null;
};

using(var d = acquire()) { // Пользуемся тем, что в using->finally есть проверка на null
  if(d != null) {
    //…
  }//if
}//if

?
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Help will always be given at Hogwarts to those who ask for it.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.