52 lines
1.6 KiB
Plaintext
52 lines
1.6 KiB
Plaintext
== Why is this an issue?
|
|
|
|
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,csharp,diff-id=1,diff-type=noncompliant]
|
|
----
|
|
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,csharp,diff-id=1,diff-type=compliant]
|
|
----
|
|
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();
|
|
}
|
|
}
|
|
----
|
|
|
|
== Resources
|
|
|
|
* CWE - https://cwe.mitre.org/data/definitions/459[CWE-459 - Incomplete Cleanup] |