Закрытие файла без использования - PullRequest
3 голосов
/ 29 ноября 2010

У меня есть класс, который читает данные из одного файлового потока и записывает в другой.Я обеспокоен закрытием потоков после завершения обработки в closeFiles ().

Как бы вы справились с возможностью того, что удаление одного потока может вызвать исключение, мешающее вызову удаления другого потока.?

Должен ли я звонить близко и распоряжаться потоками или только одним?

Что произойдет, если я обнаружу какие-либо ошибки в расположении потока, а затем продолжу перемещение и удаление файлов, как показано в lastOperation ()?

В идеальном мире я хотел бы использовать оператор using в списке инициализации в стиле c ++, но я почти уверен, что это невозможно в c #.

РЕДАКТИРОВАТЬ : спасибо за быстрые ответы, ребята.Итак, что я должен делать, это наследовать от IDisposable, а затем изменить конструктор и добавить два метода удаления, например, так:

Ответы [ 4 ]

3 голосов
/ 29 ноября 2010

Ваш класс FileProcessor не должен иметь деструктора.Это бесполезно, но это дорого.

Он должен иметь Dispose() (и реализовывать интерфейс IDisposable) для вызова closeFiles ().

И, как ответил @marcelo, Stream.Dispose () не должен выдавать.Вы можете положиться на это для классов BCL.

Но вы должны проверять каждый читатель / писатель на ноль, если первый открылся, но второй вышел из строя:

if (sr != null) sr.Dispose();
if (sw != null) sw.Dispose();

Ваш filesOpen не может охватить оба.

3 голосов
/ 29 ноября 2010

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

Затем вы должны убедиться, что в вашей реализации Dispose() не генерируются исключения. Если каждый объект, которым вы располагаете, дает такую ​​гарантию, ваш клиент будет в безопасности.

2 голосов
/ 29 ноября 2010

Методы удаления никогда не должны вызывать исключения. Для этого есть даже инструмент анализа кода , предупреждение .

0 голосов
/ 29 ноября 2010

В C # using существует. Объект, предоставленный оператору using, должен реализовывать интерфейс IDisposable. Этот интерфейс предоставляет метод Dispose, который должен высвобождать ресурсы объекта.

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

using(var sr = new StreamReader(in_filename)) {
    // Perform reader actions
}
// Reader will now be disposed.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...