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

Анализатор обнаружил в классе, не реализующим интерфейс 'IDisposable', поля или свойства, которые имеют тип реализующий интерфейс 'IDisposable'\. Подобный код говорит о том, что программист, возможно, забывает очищать некоторые ресурсы после использования объекта своего класса\.

Пример подозрительного кода:

```cpp
class Logger
{
  FileStream fs;
  public Logger() {
    fs = File.OpenWrite("....");
  }
}
```

В данном случае, класс\-обёртка, позволяющий писать лог в файл, не реализует интерфейс 'IDisposable'\. При этом он содержит переменную типа 'FileStream', позволяющую осуществлять запись в файл\. В данном случае переменная 'fs' будет держать файл до тех пор, пока не вызовется метод Finalize у объекта 'fs' \(это произойдёт, когда объект будет очищаться сборщиком мусора\)\. Как следствие, мы получим плавающую ошибку доступа, к примеру, когда попытаемся открыть этот же файл из другого потока\.

Исправить проблему можно несколькими способами\. Самым правильным является следующий:

```cpp
class Logger : IDisposable
{
  FileStream fs;
  public Logger() {
    fs = File.OpenWrite("....");
  }
  public void Dispose() { 
    fs.Dispose();
  }
}
```

Но не всегда логика программы позволяет реализовать в классе 'Logger' интерфейс 'IDisposable'\. Анализатор проверят множество ситуаций и сокращает число ложных срабатываний\. Например, в данном случае, будет достаточно закрыть 'FileStream', который пишет в файл в отдельной функции\.

```cpp
class Logger
{
  FileStream fs;
  public Logger() {
    fs = File.OpenWrite("....");
  }
  public void Close() { 
    fs.Close();
  }
}
```