2013-09-29 5 views
2

EDIT: Вниманию редакторов, пожалуйста, прочитайте ПОЛНЫЙ вопрос In addition, since this question is not only about disposing.Где назвать базовый метод?

До сих пор я видел this:

protected override Dispose(bool disposing) 
{ 
    base.Dispose(disposing); 
    if (disposing) 
     c.Dispose() 
} 

и this:

protected virtual void Dispose(bool disposing) 
{ 
    if (!disposed) 
    { 
     if (disposing) 
     { 
      // Dispose managed resources. 
     } 

     // There are no unmanaged resources to release, but 
     // if we add them, they need to be released here. 
    } 
    disposed = true; 

    // If it is available, make the call to the 
    // base class's Dispose(Boolean) method 
    base.Dispose(disposing); 
} 

И Microsoft говорит CA2215: Dispose methods should call base class dispose, here. Кроме того, поскольку этот вопрос не только об утилизации, here - еще один пример из Microsoft, вызывающего base на последней строке.

Какая из них правильная/наиболее распространенная/лучше, если таковая имеется?

ответ

2

Ваш второй фрагмент сомнительно, в зависимости от того, является ли disposed защищенным полем базового класса или нет.

protected virtual void Dispose(bool disposing) 
{ 
    if (!disposed) 
    { 
     if (disposing) 
     { 
      // Dispose managed resources. 
     }  
    } 
    disposed = true;  
    base.Dispose(disposing); // wrong if base.Disposing() depends on disposed 
} 

Вопросы, которые следует учитывать, являются исключениями и зависимостями между базовым и производным классами. Таким образом, используйте try/finally и поместите базовый вызов последним. Самый общий шаблон будет выглядеть так:

protected virtual void Dispose(bool disposing) 
{  
    if (!disposed) 
    { 
    if (disposing) 
    { 
     // Dispose managed resources. 
    }    
    }   
    base.Dispose(disposing);  
    disposed = true; // inherited or local field 
} 
+0

Большое вам спасибо! Не могли бы вы предоставить мне пример ссылки, или я должен предположить, что 'disposed' является полем частного класса? – Esteban

+1

В [официальном шаблоне] (http://msdn.microsoft.com/en-us/library/fs2xkftw.aspx) 'disposed' является закрытым. Но варианты существуют. –

+0

Я бы не стал слишком беспокоиться о попытке в конце концов. Если у ликвидатора выбрасывается исключение, то что-то глубоко ошибочно. Правильно ли иметь дело с глубоко перепутанным объектом, чтобы продолжать работать с ним? –

2

Это все о Последовательность вызовов или контроля потока, если хотите.

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

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

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