Читаем Интернет-журнал "Домашняя лаборатория", 2007 №9 полностью

По умолчанию методы обоих классов направляют вывод в окно Output. Однако это не всегда целесообразно, особенно для Release-конфигурации. Замечательным свойством методов классов Debug и Trace является то, что они могут иметь много "слушателей", направляя вывод каждому из них. Свойство Listeners этих классов возвращает разделяемую обоими классами коллекцию слушателей — TraceListenerCollection. Как и всякая коллекция, она имеет ряд методов для добавления новых слушателей: Add, AddRange, Insert — и возможность удаления слушателей: Clear, Remove, RemoveAt и другие методы. Объекты этой коллекции в качестве предка имеют абстрактный класс TraceListener. Библиотека FCL включает три неабстрактных потомка этого класса:

• DefauitTraceListener — слушатель этого класса, добавляется в коллекцию по умолчанию, направляет вывод, поступающий при вызове методов классов Debug и Trace, в окно Output;

• EventLogTraceListener — посылает сообщения в журнал событий Windows;

 TextWriterTraceListener — направляет сообщения объектам класса TextWriter или Stream; обычно один из объектов этого класса направляет вывод на консоль, другой — в файл.

Можно и самому создать потомка абстрактного класса, предложив, например, XML-слушателя, направляющего вывод в соответствующий XML-документ. Как видите, система управления выводом очень гибкая, позволяющая получать и сохранять информацию о ходе вычислений в самых разных местах.

Помимо свойства Listeners и методов печати, классы Debug и Trace имеют и другие важные методы и свойства:

• Assert и Fail, проверяющие корректность хода вычислений — о них мы поговорим особо;

• Flush — метод, отправляющий содержание буфера слушателю (в файл, на консоль и так далее). Следует помнить, что данные буферизуются, поэтому применение метода Flush зачастую необходимо, иначе метод может завершиться, а данные останутся в буфере;

• AutoFiush — булево свойство, указывающее, следует ли после каждой операции записи данные из буфера направлять в соответствующий канал. По умолчанию свойство выключено, и происходит только буферизация данных;

 Сlose — метод, опустошающий буфера и закрывающий всех слушателей, после чего им нельзя направлять сообщения.

У классов есть и другие свойства и методы, позволяющие, например, заниматься структурированием текста сообщений.

Рассмотрим пример работы, в котором отладочная информация направляется в разные каналы — окно вывода, консоль, файл:

public void Optima()

{

    double х, у=1;

    х= у — 2*Math.Sin(у);

    FileStream f = new FileStreamCDebuginfo.txt",

        FileMode.Create, FileAccess.Write);

    TextWriterTraceListener writer1 =

        new TextWriterTraceListener(f);

    TextWriterTraceListener writer2 =   

        new TextWriterTraceListener(System.Console.Out);

    Trace.Listeners.Add(writer1);

    Debug.Listeners.Add (writer2);

    Debug.WriteLine("Число слушателей: " +

       Debug.Listeners.Count);

    Debug.WriteLine("автоматический вывод из буфера: "+

       Trace.AutoFiush);

    Trace. WriteLinelf (x<0, "Trace: " + "x= " + x.ToString()

       + " у = " + y);

    Debug. WriteLine (" Debug: " + "x= " + x.ToString() +

      " у = " + у);

    Trace.Flush();

    f. Close();

}

В коллекцию слушателей вывода к слушателю по умолчанию добавляются еще два слушателя класса TextWriterTraceListener. Заметьте, что хотя они добавляются методами разных классов Debug и Trace, попадают они в одну коллекцию. Как и обещано, один из этих слушателей направляет вывод в файл, другой на консоль. На рис. 23.2 на фоне окна кода показаны три канала вывода — окно Output, консоль, файл — содержащие одну и ту же информацию.



Рис. 23.2.Три канала вывода


Метод Флойда и утверждения Assert

Перейти на страницу:

Похожие книги