Утилизирует ли Streamreader поток?
==================================

 Я посылаю поток в методы для записи, и в этих методах я использую двоичное устройство чтения / записи. Когда читатель / писатель избавляется `using` или просто, когда на него нет ссылок, поток тоже закрыт ??

 Я бы отправил BinaryReader / Writer, но я тоже использую StreamReader (возможно, мне следует обойти это. Я использую это только для GetLine и ReadLine). Это довольно хлопотно, если он закрывает поток каждый раз, когда закрывается писатель / читатель.

`StreamReader`, `StreamWriter`, `BinaryReader` а также`BinaryWriter` все закрывают / удаляют свои базовые потоки при вызове`Dispose` на них. Oни Не утилизируйте поток, если читатель / писатель просто собирается мусором - вы всегда должны утилизировать читателя / писателя, желательно с`using` заявление. (На самом деле ни у одного из этих классов нет финализаторов, и при этом они не должны быть.)

 Лично я предпочитаю также использовать оператор для потока. Вы можете вложить`using` заявления без скобок довольно аккуратно:

 Даже если`using`ператор @ для потока несколько избыточен (если только оператор`StreamReader` конструктор выдает исключение) Я считаю, что это лучшая практика, как если бы вы избавились от`StreamReader` и просто используйте поток непосредственно позднее, у вас уже будет правильная семантика удаления.



авить объект очистить все свои ресурсы. Это включает в себя очистку потоков и закрытие их файловых дескрипторов.

 Если в вашем случае вы хотите передать его другим методам, то вам нужно убедиться, что эти методы не выполняют чтение / запись в блоке using.



 если вам нужно, это переопределить метод Dispose для класса StreamWriter. Смотрите мой пост здесь для кода о том, как это сделать:

 [Делает ли. StreamWriter закрыть основной поток?](https://stackoverflow.com/questions/1187700/does-disposing-a-streamwriter-close-the-underlying-stream/6784157#6784157)



 но я хотел сделать что-то подобное сегодня и обнаружил, что все изменилось. Начиная с .net 4.5, есть`leaveOpen` аргумент:

 Единственная проблема заключается в том, что не совсем очевидно, что нужно установить для других параметров. Вот некоторая помощь:

От **[страница MSDN](https://msdn.microsoft.com/en-us/library/yhfzs7at%28v=vs.110%29.aspx)** для Конструктора StreamReader (Stream):

 Этот конструктор инициализирует кодировку для UTF8Encoding, свойство BaseStream с использованием параметра stream и размер внутреннего буфера до 1024 байтов.

 Это просто уходит`detectEncodingFromByteOrderMarks` который судя по **[исходный код](http://www.dotnetframework.org/default.aspx/DotNET/DotNET/8@0/untmp/whidbey/REDBITS/ndp/clr/src/BCL/System/IO/StreamReader@cs/1/StreamReader@cs)** является`true`

 Было бы хорошо, если бы были выставлены некоторые из этих значений по умолчанию или если аргументы были необязательными, чтобы мы могли просто указать те, которые нам нужны.



 это так. Вы можете убедиться в этом, посмотрев реализацию с помощью Reflector.



 

StreamReader закрывает соединение, когда оно удаляется. Однако "использование (Stream stream = ...) {...}" с StreamReader / StreamWriter может привести к тому, что поток будет удален дважды: (1) когда объект StreamReader удаляется (2) и когда блок Stream используя закрывается. Это приводит к предупреждению CA2202 при выполнении анализа кода VS.

 Другое решение, взятое непосредственно из [CA2202](https://msdn.microsoft.com/library/ms182334.aspx) page, это использовать блок try / finally. Настройте правильно, соединение будет закрыто только один раз.

 Недалеко от [CA2202](https://msdn.microsoft.com/library/ms182334.aspx), Microsoft рекомендует использовать следующее:

вместо того..



 using", либо с помощью явного вызова dispose