Bu basit sınıflarla başlayın ...
Diyelim ki böyle basit bir sınıf setim var:
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
, bir Driver
, Driver
iki Shoe
s, her Shoe
biri bir Shoelace
. Hepsi çok aptalca.
Ayakkabı Bağına IDisposable nesnesi ekleme
Daha sonra, üzerinde bazı işlemlerin Shoelace
çok iş parçacıklı olabileceğine karar verdim , bu yüzden EventWaitHandle
iletişim kurmak için iş parçacığı için bir ekledim. Yani Shoelace
şimdi şöyle görünür:
class Shoelace
{
private AutoResetEvent waitHandle = new AutoResetEvent(false);
bool tied = false;
// ... other stuff ..
}
Ayakkabı Bağı Üzerinde Kullanılabilir ID
Ancak şimdi Microsoft'un FxCop şikayet edecek: "Aşağıdaki IDisposable türlerin üyelerini oluşturduğu için 'Shoelace' üzerinde IDisposable uygulayın: 'EventWaitHandle'."
Tamam, uygulamak IDisposable
üzerinde Shoelace
ve benim temiz küçük sınıf bu korkunç karmaşa haline gelir:
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;
}
}
Veya (yorumcular tarafından belirtildiği gibi) Shoelace
kendisi yönetilmeyen kaynak olmadığından Dispose(bool)
ve Destructor'a ihtiyaç duymadan daha basit atma uygulamasını kullanabilirim :
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);
}
}
Dezavantajlı yayılırken dehşet içinde izleyin
Doğru bu sabit. Ama şimdi FxCop Shoe
yaratan bir şikayet edecek Shoelace
, bu yüzden de Shoe
olmalı IDisposable
.
Ve Driver
oluşturur Shoe
böylece Driver
olmalıdır IDisposable
. Ve Bus
oluşturur Driver
böylece Bus
olmalı IDisposable
vb vb.
Birdenbire yaptığım küçük değişiklik Shoelace
bana çok fazla iş çıkarıyor ve patronum neden Bus
değişiklik yapmak için ödeme yapmam gerektiğini merak ediyor Shoelace
.
Soru
Bu yayılmayı nasıl önlersiniz IDisposable
, ancak yine de yönetilmeyen nesnelerinizin uygun şekilde atılmasını sağlarsınız?