# V3072. The 'A' class containing IDisposable members does not itself implement IDisposable.

Анализатор обнаружил в классе, не реализующим интерфейс '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();
      }
    }