2016-03-25 4 views
7

Я реализации IDisposable, и в моем Dispose() метод при вызове Dispose() на других управляемых ресурсов я использую оператор ?. так:CA2213 предупреждение при использовании?. (Нуль-условный оператор) для вызова Dispose

public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

    protected virtual void Dispose(bool disposing) 
    { 
     if(disposing) 
     { 
      _ChangeLock?.Dispose(); 
     } 
    } 

Я до сих пор получаю следующее code analysis error:

CA2213: 'MyClass' содержит поле 'MyClass._ChangeLock', который имеет тип IDisposable: 'ReaderWriterLockSlim'. Измените метод Dispose на «MyClass», чтобы вызвать Dispose или Close в этом поле.

Если я изменяю к стандартной проверке нулевой, предупреждение анализа кода уходит:

if(_ChangeLock != null) 
    _ChangeLock.Dispose(); 

Есть ли что-то не так с помощью нуль-условного оператора так, как я, или этот анализ коды устаревшее правило, что ли?

+0

Это правило СА, которое необходимо обновить. – Corey

ответ

10

Это known issue с FxCop.

Оказывается, у них есть decided not to fix it:

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

+0

Отличный ответ, спасибо! – StuartMorgan

+0

Это позор, хотя я считаю, что правило полезно для многих случаев. Похоже, что излишний, когда есть довольно простой обходной путь, или его можно просто подавить пользователем. – StuartMorgan