# V3074. The 'A' class contains 'Dispose' method. Consider making it implement 'IDisposable' interface.

- Первый случай
- Второй случай

Анализатор обнаружил в классе, не реализующем интерфейс 'IDisposable', метод с именем 'Dispose'. В данном случае, возможны два варианта развития событий.

## Первый случай

Наиболее распространённым случаем является, простое несоответствие соглашениям о написании кода Microsoft. Метод c данным именем является реализацией стандартного интерфейса 'IDisposable' и применяется для детерминированной очистки ресурсов, в том числе unmanaged (неуправляемых) ресурсов.

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

    class Logger
    {
      ....
      public void Dispose()
      {
        ....
      }
    }

Согласно соглашениям, метод 'Dispose' используется для очистки ресурсов. И его наличие предполагает, что сам класс реализует интерфейс IDisposable. В данном случае есть два варианта решения проблемы.

1) Дописать в объявлении класса реализацию интерфейса IDisposable:

    class Logger : IDisposable
    {
      ....
      public void Dispose()
      {
        ....
      }
    }

Это позволит вам использовать объекты класса 'Logger' в блоке 'using', гарантирующем вызов метода Dispose при выходе из блока.

    using(Logger logger = new Logger()){
      ....
    }

2) Исправить имя метода на нейтральное. Например, на 'Close':

    class Logger
    {
      ....
      public void Close()
      {
        ....
      }
    }

## Второй случай

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

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

    class A : IDisposable
    {
      public void Dispose()
      {
        Console.WriteLine("Dispose A");
      }
    }
    class B : A
    {
      public new void Dispose()
      {
        Console.WriteLine("Dispose B");
      }
    }

В случае приведения объекта класса 'B' к интерфейсу 'IDisposable' или его использование в блоке 'using'. Например, так:

    using(B b = new B()){
      ....
    }

Будет вызвана функция 'Dispose' из класса 'A', т.е. освобождение ресурсов класса 'B' не произойдёт.

Для вызова верной функции из класса 'B', нужно дополнительно реализовать в классе 'B' интерфейс 'IDisposable'. В таком случае, при приведении объекта класса 'B' к интерфейсу 'IDisposable' или его использование в блоке 'using', будет вызвана функция 'Dispose' именно из него.

Пример исправленного кода:

    class B : A, IDisposable
    {
      public new void Dispose()
      {
        Console.WriteLine("Dispose B");
        base.Dispose();
      }
    }