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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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