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, Driveriki Shoes, her Shoebiri 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 EventWaitHandleiletiş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 Shoelaceve 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) Shoelacekendisi 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 Shoeyaratan bir şikayet edecek Shoelace, bu yüzden de Shoeolmalı IDisposable.
Ve Driveroluşturur Shoeböylece Driverolmalıdır IDisposable. Ve Busoluşturur Driverböylece Busolmalı IDisposablevb vb.
Birdenbire yaptığım küçük değişiklik Shoelacebana çok fazla iş çıkarıyor ve patronum neden Busdeğ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?