HtmlTextWriter не сбрасывается при утилизации? - PullRequest
1 голос
/ 06 июля 2011

Мне нужно написать какой-нибудь текст со стилем (например, цвет, шрифты), поэтому я решил использовать HTML. Я обнаружил, что HtmlTextWriter это класс, используемый для написания HTML-файла. Однако я обнаружил, что должен вручную закрыть или очистить его, иначе ничего не будет записано в файл. Почему это? (оператор using должен располагать его после завершения блока)

        using (HtmlTextWriter htmlWriter = new HtmlTextWriter(new StreamWriter(
            Path.Combine(EmotionWordCounts.FileLocations.InputDirectory.FullName, fileName),
            false, Encoding.UTF8)))
        {
            try
            {

                htmlWriter.WriteFullBeginTag("html");
                htmlWriter.WriteLine();
                htmlWriter.Indent++;

                htmlWriter.WriteFullBeginTag("body");
                htmlWriter.WriteLine();
                htmlWriter.Indent++;

                // write something using WriteFullBeginTag and WriteEndTag
                // ...

            } //try
            finally
            {
                htmlWriter.Indent--;
                htmlWriter.WriteEndTag("body");
                htmlWriter.WriteLine();

                htmlWriter.Indent--;
                htmlWriter.WriteEndTag("html");
                htmlWriter.Close(); // without this, the writer doesn't flush
            }
        } //using htmlwriter

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 06 июля 2011

Это ошибка в HtmlTextWriter.Вы должны сделать отдельный тестовый пример и сообщить о нем, используя Microsoft Connect .Кажется, что Close и Dispose ведут себя по-разному, что не задокументировано и крайне необычно.Я также не могу найти какую-либо документацию по MSDN, указывающую, становится ли HtmlTextWriter владельцем основного текстового редактора или нет;т. е. будет ли он располагать основным текстовым редактором или вы должны?

Редактировать 2: На странице MSDN HtmlTextWriter указано, что она наследует (в отличие от переопределений)виртуальный Dispose(bool) метод.Это означает, что текущая реализация явно не может очистить с помощью блока using.В качестве обходного пути попробуйте следующее:

using(var writer = ...make TextWriter...) 
using(var htmlWriter = new HtmlTextWriter(writer)) {

    //use htmlWriter here...

} //this should flush the underlying writer AND the HtmlTextWriter

// although there's currently no need to dispose HtmlTextWriter since
// that doesn't do anything; it's possibly better to do so anyhow in 
// case the implementation gets fixed

Кстати, new StreamWriter(XYZ, false, Encoding.UTF8) эквивалентно new StreamWriter(XYZ).StreamWriter по умолчанию создает, а не добавляет, и по умолчанию также использует UTF8 без спецификации.

Удачи - и не забудьте сообщить об ошибке !

0 голосов
/ 06 июля 2011

Я подозреваю, что причина в том, что HtmlTextWriter не предоставляет переопределение для метода protected virtual void Dispose( bool disposing ) TextWriter для вызова Close(), поэтому вы правы, вам нужно сделать это самостоятельно - реализация TextWriter пуста.Как уже указывал аспект, вам не нужен блок try finally в операторе using.Как отметил Имон Нербонн, это, безусловно, ошибка в структуре.

0 голосов
/ 06 июля 2011

Вам не нужно иметь блок try {} finally {} в операторе using, поскольку это избавит вас от объекта.

...