CA1001: реализовать Idisposable в ViewModel

#c# #visual-studio #backgroundworker #code-analysis #idisposable

#c# #visual-studio #backgroundworker #анализ кода #idisposable

Вопрос:

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

        protected virtual void Dispose(bool disposing)
        {
            if (disposing)
            {

                if (processFileBackgroundWorker != null)
                {
                    processFileBackgroundWorker.Dispose();
                    processFileBackgroundWorker = null;
                }
            }
        }
  

Я использую фонового рабочего в своей модели представления, и я получаю ошибку CA1001 в fxcop. Я понимаю, что мне нужно наследовать от Idisposable и реализовать вышеупомянутый интерфейс. Мне больше просто любопытно, как это работает, и если простое добавление этого кода произвольно в мой класс чего-нибудь достигнет. Я попытался установить точку останова, но этот код никогда не вызывается и не используется, и я был бы признателен за любые указания о том, как его правильно реализовать.

Комментарии:

1. Чтобы избавиться от предупреждений fxcop

2. Сумасшедший. Ты это сказал. Неважно.

3. Итак, если я правильно понимаю, dispose будет вызываться только при выходе из блока «using»

4. …чего не произойдет с viewmodel. Правильно. Вы можете вызвать Dispose() явно, когда viewmodels отбрасываются. Конечно, вам не нужно IDisposable для этого. Но fxcop, я думаю, не очень умный.

5. правильно… что ж, спасибо за информацию, если вы хотите поместить некоторую комбинацию этих сообщений в качестве ответа, я приму

Ответ №1:

Если fxcop стучит ложкой по подносу и требует IDisposable , а избавиться от fxcop невозможно, я предполагаю, что вам придется платить налоги.

В данном конкретном случае это немного глупо, потому что IDisposable предназначено для удаления неуправляемых ресурсов, когда объект выходит за рамки using блока или try / catch , а viewmodels таким образом не выходят за рамки. Таким образом, при обычном использовании viewmodel ничего не вызывается Dispose() .

Но вы часто отбрасываете их перед выходом из программы (при выходе из программы никого не волнует, будет ли что-нибудь удалено — все это отправляется прямиком в корзину). Я бы реализовал IDisposable , заставил бы его правильно утилизировать BackgroundWorker , как это делаете вы, и если в вашем коде есть точка, где экземпляр этой viewmodel отбрасывается, я бы явно вызвал Dispose() ее. Вам не нужно IDisposable для этого, но это безвредно.