この単位テストは、あなたが何を記述しているかをテストします。 Dispose
を呼び出しても何も起こらないことを示すために、Dispose
を呼び出しても呼び出しなくても同じことをします。
どちらの方法もファイルを作成し、ファイルを開いて書き込み、再度開いて再度書き込みます。
StreamWriter
が配置されていないため、最初のメソッドはIOException
をスローします。ファイルは既に開いており、再度開くことはできません。
ファイルを再オープンしようとする前に2番目のファイルが破棄され、それは例外なく動作します。
[TestClass]
public class DisposableTests
{
[TestMethod]
[ExpectedException(typeof(IOException))]
public void DoesntDisposeStreamWriter()
{
var filename = CreateFile();
var fs = new StreamWriter(filename);
fs.WriteLine("World");
var fs2 = new StreamWriter(filename);
fs2.WriteLine("Doesn't work - the file is already opened.");
}
[TestMethod]
public void DisposesStreamWriter()
{
var filename = CreateFile();
var fs = new StreamWriter(filename);
fs.WriteLine("World");
fs.Dispose();
var fs2 = new StreamWriter(filename);
fs2.WriteLine("This works");
fs2.Dispose();
}
private string CreateFile()
{
var filename = Guid.NewGuid() + ".txt";
using (var fs = new StreamWriter(filename))
{
fs.WriteLine("Hello");
}
return filename;
}
}
それは特に何IDisposable
アドレスではありませんので、あなたは、おそらくメモリの使用に問題は表示されません。すべてのオブジェクトはメモリを使用しますが、大部分は使い捨てではありません。ガベージコレクタは、メソッドで作成されたオブジェクトのように、参照されなくなったオブジェクトからメモリを解放します。
IDisposable
は、クラスが、ガベージコレクション。別の例はSqlConnection
です。これはメモリに関するものではなく、SQL Serverへの接続に関するものです。多くの利用可能なものがあります。 (最終的にリリースされますが、予測可能な方法ではありません - それは逃げです。)
クラスがIDisposable
である正確な理由は異なります。彼らはしばしば共通点がない。 IDisposable
はその理由を気にしません。それは、クリーンアップする必要があるクラス内に何かがあることを意味します。
「IDisposable」を継承するものは何でも..... http://stackoverflow.com/questions/538060/proper-use-of-the-idisposable-interface他にも - https://www.codeproject.com/Articles/413887/Understanding-and-Implementing-IDisposable-Interfa –
GCを廃棄しないと、GCはそれらのリソースを(まだ管理されていれば)クリーンアップします。良い例は、C++ DLLを呼び出すことであり、手動でメモリを割り当て、次にdisposeを使ってcleanup/freeを実行する必要があります。 – rolls
通常は、管理対象外のリソースのために使用します。 – Noctis