Jeśli masz 40 właściwości w jednej klasie, prawdopodobnie masz problem z projektowaniem, ale dzieje się dalej ... To naprawdę zależy od konkretnego przypadku użycia, ale powinieneś rzucić tylko ObjectDisposedException, jeśli właściwość nie może faktycznie zostanie rozwiązany, ponieważ klasa została usunięta. Dać konkretny przykład:
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;
}
}
}
tutaj właściwość Stream
zgłasza wyjątek, ponieważ podstawowa strumienia zostały usunięte, tak, że nie można ich stosować. Ale Name
nie ma powodu do rzucania. Stamtąd, w wielu przypadkach można na czynniki swój kod tak, że dostęp do rzeczywistej własności problematycznej rzuca wyjątek:
public int Length
{
get
{
// Since we access the Stream property, the ObjectDisposedException
// will be thrown when the class is disposed
return this.Stream.Length;
}
}
Jeśli nadal masz zbyt wiele właściwości do dekoracji nawet po zastosowaniu tego wzoru, możesz używać bibliotek takich jak Fody, które pozwalają wstrzykiwać zachowanie w czasie kompilacji. Używając go, możesz utworzyć atrybut, który chcesz zastosować w zależności od potrzeb.
Jednorazowy wzór był błędem .NET 1.x, którego bardzo trudno się pozbyć. Naprawiono dokładnie w .NET 2.0 z krytycznymi finalizatorami zaimplementowanymi w klasach SafeHandle. Jedynym pozostałym zastosowaniem tego wzorca jest to, kiedy klasa podstawowa go implementuje, zmuszając również do radzenia sobie z nim. Przesyłanie kodu za pomocą rzutów nie poprawia go, wystarczy polegać na klasie bazowej, aby rzucić wyjątek. –
Dziękuję za uwagi. Będę musiał zajrzeć do klasy SafeHandle. Nigdy nie podobał mi się wzór jednorazowego użytku i chciałbym znaleźć lepszy zamiennik. – JHJ