Close, Dispose и System.IO.Stream
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 17.05.13 18:19
Оценка:
Привет всем.

Задумал замутить производный класс от 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
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.