Анализатор обнаружил в классе, не реализующим интерфейс 'IDisposable', поля или свойства, которые имеют тип реализующий интерфейс 'IDisposable'. Подобный код говорит о том, что программист, возможно, забывает очищать некоторые ресурсы после использования объекта своего класса.
Пример подозрительного кода:
class Logger { FileStream fs; public Logger() { fs = File.OpenWrite("...."); } }
В данном случае, класс-обёртка, позволяющий писать лог в файл, не реализует интерфейс 'IDisposable'. При этом он содержит переменную типа 'FileStream', позволяющую осуществлять запись в файл. В данном случае переменная 'fs' будет держать файл до тех пор, пока не вызовется метод Finalize у объекта 'fs' (это произойдёт, когда объект будет очищаться сборщиком мусора). Как следствие, мы получим плавающую ошибку доступа, к примеру, когда попытаемся открыть этот же файл из другого потока.
Исправить проблему можно несколькими способами. Самым правильным является следующий:
class Logger : IDisposable { FileStream fs; public Logger() { fs = File.OpenWrite("...."); } public void Dispose() { fs.Dispose(); } }
Но не всегда логика программы позволяет реализовать в классе 'Logger' интерфейс 'IDisposable'. Анализатор проверят множество ситуаций и сокращает число ложных срабатываний. Например, в данном случае, будет достаточно закрыть 'FileStream', который пишет в файл в отдельной функции.
class Logger { FileStream fs; public Logger() { fs = File.OpenWrite("...."); } public void Close() { fs.Close(); } }