An ``++IDisposable++`` object should be disposed (there are some rare exceptions where not disposing is fine, most notably ``++Task++``). If a class has an ``++IDisposable++`` field, there can be two situations:

* The class observes a field that is under the responsibility of another class. 
* The class owns the field, and is therefore responsible for calling ``++Dispose++`` on it.

In the second case, the safest way for the class to ensure ``++Dispose++`` is called is to call it in its own ``++Dispose++`` function, and therefore to be itself ``++IDisposable++``. A class is considered to own an ``++IDisposable++`` field resource if it created the object referenced by the field.


== Noncompliant Code Example

[source,text]
----
public class ResourceHolder   // Noncompliant; doesn't implement IDisposable
{
  private FileStream fs;  // This member is never Disposed
  public void OpenResource(string path)
  {
    this.fs = new FileStream(path, FileMode.Open); // I create the FileStream, I'm owning it
  }
  public void CloseResource()
  {
    this.fs.Close();
  }
}
----


== Compliant Solution

[source,text]
----
public class ResourceHolder : IDisposable 
{ 
  private FileStream fs; 
  public void OpenResource(string path) 
  { 
    this.fs = new FileStream(path, FileMode.Open); // I create the FileStream, I'm owning it
  } 
  public void CloseResource() 
  { 
    this.fs.Close(); 
  } 

  public void Dispose() 
  { 
    this.fs.Dispose(); 
  } 
} 
----


== See

* https://cwe.mitre.org/data/definitions/459[MITRE, CWE-459] - Incomplete Cleanup

