Привет всем.
Задумал замутить производный класс от System.IO.Stream....
И реально не догоняю о чем (и чем) думал программер который мутил такую реализацию Close, Dispose в Stream
| Скрытый текст |
| // System.IO.Stream
/// <summary>Закрывает текущий поток и отключает все ресурсы (например, сокеты и файловые дескрипторы), связанные с текущим потоком.</summary>
/// <filterpriority>1</filterpriority>
public virtual void Close()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
// System.IO.Stream
/// <summary>Освобождает все ресурсы, используемые объектом <see cref="T:System.IO.Stream" />.</summary>
public void Dispose()
{
this.Close();
}
// System.IO.Stream
/// <summary>Освобождает неуправляемые (а при необходимости и управляемые) ресурсы, используемые объектом <see cref="T:System.IO.Stream" />.</summary>
/// <param name="disposing">
/// Значение true позволяет освободить управляемые и неуправляемые ресурсы; значение false позволяет освободить только неуправляемые ресурсы.</param>
protected virtual void Dispose(bool disposing)
{
if (disposing && this._asyncActiveEvent != null)
{
this._CloseAsyncActiveEvent(Interlocked.Decrement(ref this._asyncActiveCount));
}
}
|
| |
Ну вот, черт, возьми и поменяй реализации Close и Dispose местами. Так, как это (фактически) сделано в System.IO.TextReader. И все будут счастливы.
Одним могут сделать Close/Dispose монописуальными.
Другие могут замутить так, что Close!=Dispose. То есть после Close еще можно вызвать Dispose, а вот после Dispose вызвать Close уже нельзя (ObjectDisposedException).
А в текущем виде этот Close — вот он даром не впился. Потому что нельзя узнать — Close был вызван явно или через Dispose
-- Пользователи не приняли программу. Всех пришлось уничтожить. --