Nasıl tüm derslerine yayılmasını önlemek IDisposable musunuz?
Başlaması ile bu basit dersleri...
Diyelim ki böyle: sınıflar basit bir dizi 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;
}
Shoe
Shoelace
her Bus
Driver
, Driver
var Shoe
s,. Çok saçma.
IDisposable bir nesne Ayakkabı ekleyin
Daha sonra Shoelace
bazı çalışma konuları ile iletişim kurmak için EventWaitHandle
ekledim çok kanallı olabilir, buna ben karar veririm. Shoelace
şimdi bu gibi görünüyor:
class Shoelace
{
private AutoResetEvent waitHandle = new AutoResetEvent(false);
bool tied = false;
// ... other stuff ..
}
Ayakkabı bağı üzerinde IDisposable uygulamak
Ama şimdi FxCop şikayet edecektir:"'Aşağıdaki IDisposable türlerinin üyeleri oluşturur:'''." EventWaitHandle Ayakkabı bağı uygulamak IDisposable
Tamam, ben Shoelace
güzel benim küçük sınıf IDisposable
Bu korkunç karışıklık olur uygulamak:
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;
}
}
Ya da ziyaretçi tarafından belirttiği gibi) Shoelace
beri hiçbir yönetilmeyen kaynakları kendisi vardır, Dispose(bool)
ve Yıkıcı kalmadan daha basit atma uygulaması 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);
}
}
IDisposable yayıldıkça korku içinde izle
Sağ sabit. Ama şimdi FxCop Shoe
Shoelace
, Shoe
IDisposable
de olmalı yani bir yaratan şikayet edecektir.
Driver
Driver
IDisposable
olmalı Shoe
oluşturur.
Bus
Bus
IDisposable
ve üzerinde olmalı Driver
oluşturur.
Aniden Shoelace
benim küçük değişiklik bana bir sürü iş neden olduğunu ve patronum Bus
Shoelace
bir değişiklik yapmak için ödeme yapmak istiyorum neden merak ediyor.
Soru
Nasıl IDisposable
, Bu yayılmasını önlemek ama hala yönetilmeyen nesneleri düzgün bir şekilde atılmasını sağlar?
CEVAP
Gerçekten "" yayılmasını IDisposable. önüne geçemezsiniz Bazı sınıflar bertaraf edilmesi, AutoResetEvent
ve en etkili yolu sonlandırıcı yükünü önlemek için Dispose()
yöntemi yapmak gibi bir ihtiyaç. Ama bu yöntem bir şekilde çağrılmalıdır, örnek olarak saklanması ya da içeren IDisposable sınıfları tek kullanımlık olması da gerekir, bu vb kurtulmam gerekiyor. Bunu önlemek için tek yol vardır:
- mümkünse IDisposable sınıfları kullanmaktan kaçının, kilit veya tek yerlerde olaylar bekleyin, tek bir yerde pahalı kaynakları, vb tutmak
- sadece onlara ihtiyacınız olduğunda onları oluşturmak ve onları hemen sonra (
using
desen) atın
Bazı durumlarda IDisposable isteğe bağlı bir durum desteklediği için göz ardı edilebilir. Örneğin, WaitHandle uygular adlı bir Dışlama destek için IDisposable. Eğer bir isim kullanılıyorsa, Atma yöntemini hiçbir şey yapmaz. MemoryStream başka bir örnek, hiçbir sistem kaynaklarını kullanır ve uygulama Atmayın onun da hiçbir şey yapmaz. Yönetilmeyen bir kaynak kullanılmakta olup, olmadığı konusunda dikkatli düşünme öğretim olabilir. Böylece mevcut kaynakların incelenmesi .net kitaplıkları ya da bir hızlı yolu kullanarak.
Nasıl PHP ve HTML/XML ayrıştırma işlem...
Nasıl JavaScript ile boş bir dize için...
Nasıl JSP dosyaları Java kod önlemek i...
Nasıl belirli bir klasöre git deposu k...
Nasıl PHP bir karma parolalar için bcr...