Как мне вернуть StringWriter, когда я не могу его клонировать? - PullRequest
0 голосов
/ 24 мая 2010

Мой код выглядит следующим образом.Очевидно, я не могу написать «ОК», потому что объект был удален.Я не могу вернуть sw.Clone (), потому что клон не существует.Если я не использую использование, то в любой момент между = new и return (как итерация и запись в объект, как не делает мой пример) может возникнуть исключение и, следовательно, не удаление объекта.Должен ли я определить sw вне блока try и проверить, является ли он пустым, а затем поместить в блок catch?Это похоже на излишнюю работу.Есть ли способ лучше?Это единственный способ?

    static void func1()
    {
        using (var sw = func2())
        {
            sw.WriteLine("Ok");
        }
    }
    static StringWriter func2()
    {
        using (var sw = new StringWriter())
        {
            return sw;
        }
    }

Ответы [ 5 ]

1 голос
/ 24 мая 2010

Возможно, вы захотите пересмотреть возвращение StringWriter. Хотя у вас может быть несколько мест, где вам понадобится эта дополнительная функциональность, мне кажется, что сантехника торчит посреди гостиной. Он не должен быть частью общедоступного API и даже неуклюжим даже в частном.

С учетом сказанного, если он вам нужен, не закрывайте и не удаляйте его перед возвратом и не используйте блок using. Используйте блок try / catch (т. Е. Dispose в catch, а не предложение finally).

0 голосов
/ 24 мая 2010

Я собираюсь предположить, что это общий вопрос о возвращении объектов, которые реализуют IDisposable, а не вопрос о func1 и func2.

Использование блока using вокруг чего-либореализации IDisposable, если вы

  1. создаете его и
  2. больше не нужны, когда ваш метод возвращает

В вашем случае вы создаете егоно он должен существовать после возврата вашего метода.В этом случае не используйте блок using в методе, который создает объект.После этого вызывающая сторона несет ответственность за удаление объекта, что, как я вижу, уже выполняется.

0 голосов
/ 24 мая 2010

Избавьтесь от второго использования блока. Просто сделай

StringWriter sw = new StringWriter();
return sw;

StringWriter удаляется, если вы определяете его в блоке using.

0 голосов
/ 24 мая 2010

К вашему сведению: реализация закрытия StringWriter вызывает метод Dispose , передавая истинное значение. Почему бы просто не вернуть второй sw в вызывающий метод и вызвать close, который будет эквивалентен.

0 голосов
/ 24 мая 2010

Создайте класс с помощью методов func1 и func2, сделайте этот IDisposable, инициализируйте StringWriter в конструкторе и избавьтесь от него в методе Dispose вашего класса.

Предполагается, что вы пишете в StringWriter несколькими способами.

...