Mulailah dengan kelas-kelas sederhana ini ...
Katakanlah saya memiliki satu set kelas sederhana seperti ini:
class Bus
{
Driver busDriver = new Driver();
}
class Driver
{
Shoe[] shoes = { new Shoe(), new Shoe() };
}
class Shoe
{
Shoelace lace = new Shoelace();
}
class Shoelace
{
bool tied = false;
}
A Bus
memiliki a Driver
, Driver
memiliki dua Shoe
s, masing-masing Shoe
memiliki a Shoelace
. Semuanya sangat konyol.
Tambahkan objek IDisposable ke Tali Sepatu
Kemudian saya memutuskan bahwa beberapa operasi pada Shoelace
dapat menjadi multi-utas, jadi saya menambahkan EventWaitHandle
untuk utas untuk berkomunikasi. Jadi Shoelace
sekarang terlihat seperti ini:
class Shoelace
{
private AutoResetEvent waitHandle = new AutoResetEvent(false);
bool tied = false;
// ... other stuff ..
}
Menerapkan IDisposable di Shoelace
Tapi sekarang Microsoft FxCop akan mengeluh: "Implementasikan IDisposable di 'Shoelace' karena itu membuat anggota IDisposable type berikut: 'EventWaitHandle'."
Oke, saya menerapkan IDisposable
pada Shoelace
dan rapi kelas kecil saya menjadi kekacauan ini mengerikan:
class Shoelace : IDisposable
{
private AutoResetEvent waitHandle = new AutoResetEvent(false);
bool tied = false;
private bool disposed = false;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
~Shoelace()
{
Dispose(false);
}
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
if (waitHandle != null)
{
waitHandle.Close();
waitHandle = null;
}
}
// No unmanaged resources to release otherwise they'd go here.
}
disposed = true;
}
}
Atau (seperti yang ditunjukkan oleh komentator) karena Shoelace
itu sendiri tidak memiliki sumber daya yang tidak terkelola, saya mungkin menggunakan implementasi pembuangan yang lebih sederhana tanpa memerlukan Dispose(bool)
dan Destructor:
class Shoelace : IDisposable
{
private AutoResetEvent waitHandle = new AutoResetEvent(false);
bool tied = false;
public void Dispose()
{
if (waitHandle != null)
{
waitHandle.Close();
waitHandle = null;
}
GC.SuppressFinalize(this);
}
}
Saksikan dengan ngeri saat ID sekali pakai menyebar
Benar itu sudah diperbaiki. Tapi sekarang FxCop akan komplain yang Shoe
membuat Shoelace
, jadi Shoe
pasti IDisposable
juga.
Dan Driver
menciptakan harus Shoe
begitu . Dan menciptakan begitu harus dan seterusnya.Driver
IDisposable
Bus
Driver
Bus
IDisposable
Tiba-tiba perubahan kecil saya menjadi Shoelace
menyebabkan saya banyak pekerjaan dan bos saya bertanya-tanya mengapa saya perlu membayar Bus
untuk membuat perubahan Shoelace
.
Pertanyaan
Bagaimana Anda mencegah penyebaran ini IDisposable
, tetapi masih memastikan bahwa objek yang tidak dikelola dibuang dengan benar?