Книга: ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
Проверка контекста объекта
Проверка контекста объекта
Из тех приложений, которые вы построите сами, очень немногие могут потребовать программного взаимодействия с контекстом, но вот вам пример для иллюстрации подхода, о котором идет речь. Создайте новое консольное приложение с именем ContextManipulator. Это приложение будет определить один контекстно-независимый класс (SportsCar) и один контекстно-связанный (SportsCarTS).
using System.Runtime.Remoting.Contexts; // Для типа Context.
using System.Threading; // Для типа Thread.
// Тип SportsCar не имеет специальных контекстных требований
// и будет загружен в рамках контекста, создаваемого доменом
// приложения по умолчанию.
public class SportsCar {
public SportsCar() {
// Чтение информации и вывод идентификатора контекста.
Context ctx = Thread.CurrentContext;
Console.WriteLine("{0} объект в контексте {1}", this.ToString(), ctx.ContextID);
foreach (IContextProperty itfCtxProp in ctx.ContextProperties) Console.WriteLine("-› Свойство контекста: {0}", itfCtxProp.Name);
}
}
// Тип SportsCarTS требует загрузки
// в синхронизированном контексте.
[Synchronization]
public class SportsCarTS: ContextBoundObject {
public SportsCarTS() {
// Чтение информации и вывод идентификатора контекста.
Context ctx = Thread.CurrentContext;
Console.WriteLine("{0} объект в контексте {1}", this.ToString(), ctx.ContextID);
foreach(IContextProperty itfCtxProp in ctx.ContextProperties) Console.WriteLine("-› Свойство контекста: {0}", itfCtxProp.Name);
}
}
Обратите внимание на то. что каждый конструктор получает тип Context от текущего потока выполнения через статическое свойство Thread.CurrentContext. Используя объект Context, вы можете распечатать информацию о границах контекста, например, значение ID контекста или значения дескрипторов, полученных через Context.ContextProperties. Это свойство возвращает объект, реализующий интерфейс IContextProperty, который обеспечивает доступ к дескрипторам с помощью свойства Name. Теперь обновите метод Main(), чтобы разместить по экземпляру каждого из типов класса.
static void Main(string[] args) {
Console.WriteLine("*** Чудесное контекстное приложение ***n");
// При создании объекты будут отображать информацию контекста.
SportsCar sport = new SportsCar();
Console.WriteLine();
SportsCar sport2 = new SportsCar();
Console.WriteLine();
SportsCarTS synchroSport = new SportsCarTS();
Console.ReadLine();
}
По мере создания объектов конструкторы классов отображают различные элементы информации о контексте (рис. 13.10).
Рис. 13.10. Исследование контекста объекта
Для класса SportsCar не был указан атрибут контекста, поэтому среда CLR размещает sport и sport2 в контексте 0 (т.е. в контексте, созданном по умолчанию). Однако объект SportsCarTS загружается в свои уникальные контекстуальные границы (которым назначается идентификатор 1), поскольку для этого контекстно-связанного типа был указан атрибут [Synchronization].
Исходный код. Проект ContextManipulator размещен в подкаталоге, соответствующем главе 13.
- Проверка границ
- Границы контекста объекта
- Практическая работа 53. Запуск Access. Работа с объектами базы данных
- 5. Null-значения и проверка условий
- 5.2.3. Действия с объектами Numbers
- 12.6. Обращение к объектам, отображенным в память
- 12.1. Автоматизированная проверка безопасности
- 12.3. Проверка конфигурации
- Проверка, что сервер Firebird запущен
- Проверка на вирусы с помощью сканера Dr.Web
- Проверка правописания
- Проверка и ремонт