2010-02-10 3 views
0

Одно из правил для реализации метода Dispose говорит:.Реализация Одноразовая шаблон правильно - авто Реализуемый свойства

«Бросьте ObjectDisposedException из методов экземпляра на этом типе (кроме Dispose), когда ресурсы уже расположенным Это правило делает не применяются к методу Dispose, потому что он должен быть вызван несколько раз, не выбрасывая исключение ».

См: http://msdn.microsoft.com/en-us/library/b1yfkh5e.aspx

Означает ли это, что если я хочу, чтобы правильно реализовать свойства, я не могу использовать авто Реализуемого свойства? Нужны ли свойства, реализующие его как этот?

private bool _property; 
    public bool Property 
    { 
     get 
     { 
      if(disposed) throw new ObjectDisposedException ("MyClass"); 
      return _property; 
     } 
     set 
     { 
      if(disposed) throw new ObjectDisposedException ("MyClass"); 
      _property=value; 
     } 
    } 

ответ

2

Как правило, свойства должны действовать как поля (практически без вычислений, возвращать одинаковое значение на протяжении множества вызовов, если никакого другого состояния не изменилось), поэтому они не нуждаются в полной проверке Dispose, но вы должны поставить проверяет определенные общедоступные методы в вашем классе.

+0

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

1

зависит от цели. Вызов объекта-объекта является краевым условием, поэтому вы обычно не хотите жертвовать эффективностью своего объекта при регулярном использовании, добавляя все эти тесты. Правильный способ прочитать правила является:

Если вызов метода, расположенную на Disposed вызовет исключение или иметь нежелательные последствия, бросить ObjectDisposedException

Э.Г. Если метод Dispose вашего класса устанавливает какое-либо поле в null, вы должны бросить ObjectDisposedException из методов/свойств, используя это поле, вместо того, чтобы сбой с NullReferenceException.

Смежные вопросы