Tek bir sınıfta 40 mülkünüz varsa, büyük olasılıkla bir tasarım sorununuz var, ancak devam edersiniz ... Bu, belirli kullanım durumuna bağlıdır, ancak yalnızca ObjectDisposedException öğesini atmanız gerekir. Aslında sınıf çözülmüş olduğu için çözülmelidir. Somut bir örnek vermek gerekirse: Burada
public class MyStream : IDisposable
{
private string name;
private Stream stream;
public MyStream(string name)
{
this.Name = name;
this.Stream = new FileStream(...);
}
public string Name
{
get
{
return this.name;
}
}
public Stream Stream
{
get
{
if (this.IsDisposed)
{
throw new ObjectDisposedException();
}
return this.stream;
}
}
private bool IsDisposed { get; set; }
public void Dispose()
{
if (!this.IsDisposed)
{
this.IsDisposed = true;
this.Stream.Dispose();
this.Stream = null;
}
}
}
, altta yatan akışı bertaraf edildiği için mülk Stream
bir istisna atar, bu nedenle artık kullanılamaz. Ancak Name
'un atması için bir sebebi yok. Gerçek sorunlu özelliğine erişimin istisna atar Oradan birçok durumda, kodunuzu çarpanlara edebilirsiniz:
public int Length
{
get
{
// Since we access the Stream property, the ObjectDisposedException
// will be thrown when the class is disposed
return this.Stream.Length;
}
}
hala bile bu modeli izledikten sonra süslemek için çok fazla özelliklere sahip olursa, derleme zamanında bir davranış enjekte etmenizi sağlayan Fody gibi kütüphaneleri kullanabilirsiniz. Bunu kullanarak, özelliklerde gerektiği gibi uyguladığınız bir [ThrowIfDisposed]
özniteliği oluşturabilirsiniz.
Tek kullanımlık desen, .NET 1.x hatasıydı, kurtulmak çok zordu. SafeHandle sınıflarında uygulanan kritik finalizatörler ile .NET 2.0'da iyice düzeltildi. Model için geriye kalan tek kullanım, temel sınıfın onu uygulayarak sizi bununla başa çıkmaya zorlamasıdır. Kodunuzu atarla bilerek daha iyi yapmazsınız, sadece istisnai atmak için temel sınıfa güvenirsiniz. –
Yorumlarınız için teşekkür ederiz. SafeHandle sınıfına bakmam gerekecek. Tek kullanımlık modeli hiç sevmedim ve daha iyi bir yedek bulmayı çok isterim. – JHJ