Можно и самому создать потомка абстрактного класса, предложив, например, XML-слушателя, направляющего вывод в соответствующий XML-документ. Как видите, система управления выводом очень гибкая, позволяющая получать и сохранять информацию о ходе вычислений в самых разных местах. Помимо свойства Listeners и методов печати, классы Debug и Trace имеют и другие важные методы и свойства: - Assert и Fail, проверяющие корректность хода вычислений - о них мы поговорим особо;
- Flush - метод, отправляющий содержание буфера слушателю (в файл, на консоль и так далее). Следует помнить, что данные буферизуются, поэтому применение метода Flush зачастую необходимо, иначе метод может завершиться, а данные останутся в буфере;
- AutoFlush - булево свойство, указывающее, следует ли после каждой операции записи данные из буфера направлять в соответствующий канал. По умолчанию свойство выключено, и происходит только буферизация данных;
- Close - метод, опустошающий буфера и закрывающий всех слушателей, после чего им нельзя направлять сообщения.
У классов есть и другие свойства и методы, позволяющие, например, заниматься структурированием текста сообщений. Рассмотрим пример работы, в котором отладочная информация направляется в разные каналы - окно вывода, консоль, файл: public void Optima() { double x, y=1; x= y - 2*Math.Sin(y); FileStream f = new FileStream("Debuginfo.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.AutoFlush); Trace.WriteLineIf(x<0, "Trace: " + "x= " + x.ToString() + " y = " + y); Debug.WriteLine("Debug: " + "x= " + x.ToString() + " y = " + y); Trace.Flush(); f.Close(); } В коллекцию слушателей вывода к слушателю по умолчанию добавляются еще два слушателя класса TextWriterTraceListener. Заметьте, что хотя они добавляются методами разных классов Debug |