rspec/rules/S2931/rule.adoc

53 lines
1.5 KiB
Plaintext
Raw Normal View History

2020-12-23 14:59:06 +01:00
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.
2020-12-23 14:59:06 +01:00
- The class owns the field, and is therefore responsible for calling ``Dispose`` on it.
2020-06-30 12:48:07 +02:00
2020-12-23 14:59:06 +01:00
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.
2020-06-30 12:48:07 +02:00
== Noncompliant Code Example
----
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
----
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
* http://cwe.mitre.org/data/definitions/459.html[MITRE, CWE-459] - Incomplete Cleanup