56 lines
1.6 KiB
Plaintext
56 lines
1.6 KiB
Plaintext
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
|
||
|