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();
}
}