Здравствуйте, igna, Вы писали:
I>расчитывая, что BinaryReader.Close закроет и FileStream. I>А что если в конструкторе BinaryReader будет брошено исключение?
В данном случае это ответственность вызывающего кода. Стрим останется "висеть": что здесь "удивительного" и как, по твоему мнению, могло бы быть иначе?
З.Ы. Зачем спрашивать, когда прорить куда как быстрее?
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, _FRED_, Вы писали:
_FR>В данном случае это ответственность вызывающего кода. Стрим останется "висеть": что здесь "удивительного" и как, по твоему мнению, могло бы быть иначе?
Аналогичное в C++ это типичная ошибка, но там об этом в книгах пишут (Sutter например), что так программировать неправильно, а в .NET сплошь и рядом примеры пытающиеся закрыть читатель (или писатель) и поток одним using-ом, что в книгах, что в MSDN.
Здравствуйте, igna, Вы писали:
_FR>>В данном случае это ответственность вызывающего кода. Стрим останется "висеть": что здесь "удивительного" и как, по твоему мнению, могло бы быть иначе?
I>Аналогичное в C++ это типичная ошибка, но там об этом в книгах пишут (Sutter например), что так программировать неправильно, а в .NET сплошь и рядом примеры пытающиеся закрыть читатель (или писатель) и поток одним using-ом, что в книгах, что в MSDN.
Что-то не понял Можно пример? Что является типичной ошибкой? "Как" это "неправильно"? Что за "прмиеры"?
Help will always be given at Hogwarts to those who ask for it.
I> using (var reader = new BinaryReader(new FileStream(path, FileMode.Open), encoding))
I> . . .
I>
I>, а конструктор BinaryReader бросит исключение?
Вообще, надо сказать, что disposable паттерн тот еще геморрой. Я для себя принял правило, что если объект ко мне пришел откуда-то, то dispose не звать. За вызов dispose должен отвечать код, который объект создал.
Да, у этого конструктора BinaryReader нет параметра encoding, но для конструктора с параметром нет примера, потому первое, что приходит в голову, воспользоваться примером для конструктора без параметра, просто добавив последний:
А это уже точно (в общем случае) ошибка, поскольку encoding может оказаться равным null, конструктор BinaryReader бросит исключение и FileStream окажется бесхозным. Является ли ошибкой пример приведенный в MSDN, то есть возможно ли и здесь исключение в конструкторе, даже если File.Open вернул успешно сконструированный FileStream, не знаю, но спецификаций исключений в .NET нет, нет потому и никакой гарантии, что в следующей версии этот конструктор BinaryReader не начнет бросать еще какое-нибудь исключение, по этой причине думаю, что лучше самому закрывать FileStream:
using (var fileStream = File.Open(fileName, FileMode.Open))
using (var binReader = new BinaryReader(fileStream))
. . .
Здравствуйте, Константин Л., Вы писали:
КЛ>Вообще, надо сказать, что disposable паттерн тот еще геморрой. Я для себя принял правило, что если объект ко мне пришел откуда-то, то dispose не звать. За вызов dispose должен отвечать код, который объект создал.
А что ты пишешь вместо этого?:
using (var reader = new BinaryReader(new FileStream(path, FileMode.Open), encoding))
. . .
Здравствуйте, igna, Вы писали:
I>Аналогичное в C++ это типичная ошибка, но там об этом в книгах пишут (Sutter например), что так программировать неправильно, а в .NET сплошь и рядом примеры пытающиеся закрыть читатель (или писатель) и поток одним using-ом, что в книгах, что в MSDN.
Скорее всего это от того, что в c++ это действительно ошибка, а в .net — так, warning )
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, igna, Вы писали:
I>Здравствуйте, _FRED_, Вы писали:
_FR>>В данном случае это ответственность вызывающего кода. Стрим останется "висеть": что здесь "удивительного" и как, по твоему мнению, могло бы быть иначе?
I>Аналогичное в C++ это типичная ошибка, но там об этом в книгах пишут (Sutter например), что так программировать неправильно, а в .NET сплошь и рядом примеры пытающиеся закрыть читатель (или писатель) и поток одним using-ом, что в книгах, что в MSDN.
Кстати, да. Вот из MSDN:
// Create a file and store the application settings.public void Close()
{
using(BinaryWriter binWriter =
new BinaryWriter(File.Open(fileName, FileMode.Create)))
{
binWriter.Write(aspectRatio);
binWriter.Write(lookupDir);
binWriter.Write(autoSaveTime);
binWriter.Write(showStatusBar);
}
}
При этом в коде конструктора BinaryWriter мы видим, что он элементарно может бросить исключение, если поток не поддерживает запись.
Здравствуйте, igna, Вы писали:
I>Здравствуйте, Константин Л., Вы писали:
КЛ>>Вообще, надо сказать, что disposable паттерн тот еще геморрой. Я для себя принял правило, что если объект ко мне пришел откуда-то, то dispose не звать. За вызов dispose должен отвечать код, который объект создал.
I>А что ты пишешь вместо этого?:
I>
I> using (var reader = new BinaryReader(new FileStream(path, FileMode.Open), encoding))
I> . . .
I>