IDISP003

November 25, 2021 ยท View on GitHub

Dispose previous before re-assigning

TopicValue
IdIDISP003
SeverityWarning
EnabledTrue
CategoryIDisposableAnalyzers.Correctness
CodeArgumentAnalyzer
AssignmentAnalyzer

Description

Dispose previous before re-assigning.

Motivation

In the following example the old file will not be disposed when setting it to a new file in the Update method.

public sealed class Foo : IDisposable
{
    private FileStream stream = File.OpenRead("file.txt");

    public void Update(string fileName)
    {
        this.stream = File.OpenRead(fileName);
    }

    public void Dispose()
    {
        this.stream.Dispose();
    }
}

How to fix violations

Dispose the old value before assigning a new value.

public sealed class Foo : IDisposable
{
    private FileStream stream = File.OpenRead("file.txt");

    public void Update(string fileName)
    {
        this.stream?.Dispose();
        this.stream = File.OpenRead(fileName);
    }

    public void Dispose()
    {
        this.stream.Dispose();
    }
}

Configure severity

Via ruleset file.

Configure the severity per project, for more info see MSDN.

Via #pragma directive.

#pragma warning disable IDISP003 // Dispose previous before re-assigning
Code violating the rule here
#pragma warning restore IDISP003 // Dispose previous before re-assigning

Or put this at the top of the file to disable all instances.

#pragma warning disable IDISP003 // Dispose previous before re-assigning

Via attribute [SuppressMessage].

[System.Diagnostics.CodeAnalysis.SuppressMessage("IDisposableAnalyzers.Correctness", 
    "IDISP003:Dispose previous before re-assigning", 
    Justification = "Reason...")]