Коллекция слушателей. Резюме.
Классы Trace (Трассировка) и Debug (Отладка) имеют статическую коллекцию слушателей, называемую TraceListenerCollection. Эта коллекция представляет собой список объектов TraceListener, которые получают информацию, выводимую классами Debug (Отладка) и Trace (Трассировка). Слушатели добавляются в коллекцию и удаляются из нее подобно тому, как это делается для любой другой коллекции .NET.
// создать слушатель, который пишет на пульт (console) TextWriterTraceListener *ConsoleOutput = new TextWriterTraceListener( Console::Out, "Console::Out Listener"); // Слушатель Trace::Listeners › Add(ConsoleOutput); // Слушатели › Добавить // создать слушатель, который пишет в текстовый файл Stream *OutputFile = File::Create("output.txt"); // Файл:: Создать TextWriterTraceListener *OutputFileListener = new TextWriterTraceListener( OutputFile, "Output File Listener"); // "Слушатель Выходного файла"); Trace::Listeners › Add(OutputFileListener); // Слушатели › Добавить // удалить заданный по умолчанию (default) слушатель Trace::Listeners › Remove("Default"); // Слушатели › Удалить ("по умолчанию")
В этом фрагменте программы объект OutputFileListener будет посылать вывод трассировки в файл с именем output.txt. Слушатель по умолчанию DefaultTraceListener добавляется в коллекции Listener (Слушатель) автоматически. Любой из слушателей, в том числе и предлагаемый по умолчанию, может быть удален из коллекции с помощью вызова метода Remove (Удалить) этой коллекции. Чтобы составить список всех слушателей в коллекции, можно выполнить следующий фрагмент кода:
pEnum = Trace::Listeners › GetEnumerator(); // Слушатели while (pEnum › MoveNext()) { TraceListener *tr = dynamic_cast<TraceListener *>(pEnum › Current); Console::WriteLine( String::Format("\t{0}", tr › Name)); // Строка:: Формат }
Резюме
Добавление в приложения инструментальных средств для различных уровней детализации вывода отладки и диагностики является общей задачей программирования. Классы диагностики являются примером того, как же в среде .NET для решения стандартных задач программирования реализуются классы, чтобы программист мог сконцентрироваться именно на логике самой программы, а не на создании инфраструктуры отладки.
С другой стороны, это также является примером продуманного разделения классов .NET, которое позволяет настраивать инфраструктуру таким образом, чтобы программист мог использовать минимум или максимум доступных функций, в зависимости от его потребностей.