приведение к передаче параметров - PullRequest
0 голосов
/ 10 ноября 2010

Мне нужно получить доступ к свойствам x и y объекта obj (типа some ClassA) в методе обработки событий, подписанном на событие в объекте obj.

Option1: просто создайте это событие типа EventHandler, приведите отправителя.

void handlingMethod(object sender, EventArgs e)
{
    ClassA ca = sender as ClassA;
    Dosomething(ca.id, ca.x, ca.y);
}

RaiseEvent(this,null); //in ClassA

Option2: Создайте SpecialEventHandler1, чтобы избежать приведения.

void handlingMethod(SpecialEventArgs e)
{
    Dosomething(e.id, e.x,e.y);
}

RaiseSpecialEvent1(new SpecialEventArgs(this.id, this.x,this.y));//in ClassA

Вариант3: Создайте SpecialEventHandler2, чтобы можно было избежать как приведения, так и создания нового объекта SpecialEventArgs.

void handlingMethod(ClassA sender)
{
     Dosomething(sender.id, sender.x, sender.y);
}
RaiseSpecialEvent2(this); //in ClassA

Допустим, эти события происходят постоянно @ 50 / сек. Какой из них более эффективен? Это зависит от размера ClassA? Я предполагаю, что Option3 - лучший способ с точки зрения производительности. Пожалуйста, дайте ваши идеи.

1 Ответ

3 голосов
/ 10 ноября 2010

50 Гц это не так быстро, поэтому лучше всего придерживаться соглашения.Это сделает ваш код более доступным для новых разработчиков.Также не забывайте использовать приведение, когда вы ожидаете только один тип, чтобы вы могли получить подробное исключение, если событие вызвано неправильно.

void MyClassA_Something(object sender, EventArgs e)
{
    ClassA ca = (ClassA)sender;
    Dosomething(ca.id, ca.x, ca.y);
}

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

void MyClassA_Something(object sender, EventArgs e)
{
    ThreadPool.QueueUserWorkItem(o => {
        ClassA ca = (ClassA)sender;
        Dosomething(ca.id, ca.x, ca.y);
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...