Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #71, ОКТЯБРЬ 2006 г.

скрытые фичи C#

ДРОЗДОВ АНДРЕЙ AKA SULVERUS

Спецвыпуск: Хакер, номер #071, стр. 071-076-4


[дальше – больше.]

Давай на время вспомним, как работают процессы в Win2k. Раньше приложение могло состоять из нескольких процессов, которые могли порождать новые потоки. В платформе .NET все немного иначе, соответственно и в Windows Vist'e тоже. Теперь есть понятие «домен приложения», которое является своеобразным контейнером для потоков в .NET-платформе, то есть домен приложения полностью огораживает поток и его ресурсы от других потоков и доменов приложений. В результате разные домены приложений не могут совместно использовать одни и те же ресурсы, даже если они являются глобальными. Непонимание этого факта приводит к довольно серьезным ошибкам. Для работы с доменами приложений есть класс AppDomain, так давай же поковыряем его! Чтобы было проще это понять, напишем класс BindingCodeDomain, в котором будет 2 функции: первая получает строку и дописывает туда данные, вторая регистрирует первую, как новый метод в созданном нами делегате msg_sender в классе bug:

создаем домен приложения

public class BindingCodeDomain

{

public static string msg_text;

public static void mmsg(string text)

{

msg_text = text + "bind_test";

}

public static void DelegateBind()

{

bug.msg_sender Msg2 = new bug.msg_sender(mmsg); //создаем новый делегат

Msg2.Invoke("DelegateBinde TEST_STRING"); //вызываем метод

}

}

Тут все понятно: метод mmsg получает входное значение и подтверждает то, что она посмотрела ее. Теперь, чтобы выделить нашему классу отдельный домен приложения, мы допишем еще одну функцию. Эта функция будет инициализировать класс, как отдельный домен приложения. Для создания домена приложения нужно зарегистрировать тип AppDomain и указать, какой класс отвести под новый домен. В нашем случае нужно использовать свойство CurrentDomain:

AppDomain CDomain = AppDomain.CurrentDomain;

Console.WriteLine("CodeDomain Create OK..");

После запуска приложения мы увидим, что выводится строка и к ней приписано bind_test. Следовательно, все работает.

[объектно сориентируемся.]

Теперь я бы хотел внести ясность в тему работы с объектами. Для того чтобы создать объект, нужно использовать директиву new. Для примера напишем два класса, которые будут имитировать жуков, бегающих наперегонки, и заодно будем закреплять пройденное :).

Во-первых, надо создать субкласс в классе bug, который, собственно, и будет бегать. Для этого у жука должны быть параметры name, max_speed, age и метод Run, чтобы он мог бегать. Также заранее хочу познакомить тебя с функцией Random(), которая скоро нам понадобится :). Для начала придумаем концепцию: создаем метод, который делает объект класса BugSpeedy и предает ему определенные параметры, после чего создаем два процесса, и жуки бегут наперегонки. Для создания объектов у нас будет использоваться конструктор объектов, которому нужно будет передавать параметры. Также конструктор будет создавать поток для жука. Мы создадим двух жуков (Петю и Васю), заранее подготовив в классе BugSpeedy метод Run для бега. В методе Run будет просто реализован цикл for и набор простых математических операций, чтобы рассчитать скорость жука. Теперь, благодаря таким нехитрым заморочкам, мы оптимизировали код, и вся игра в жуков будет занимать 4 строки:

Назад на стр. 071-076-3  Содержание  Вперед на стр. 071-076-5