2010-11-09 4 views
0

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

Вариант1: просто введите это событие типа 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 - лучший способ с точки зрения производительности. Пожалуйста, дайте свои идеи.

+0

Какой langague? Ява? – jball

+0

язык C# – user441660

ответ

3

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

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); 
    }); 
} 
+0

спасибо @ChaosPandion. но как насчет 500 и DoSomething, занимающих значительное количество времени? Вы говорите, что в любом случае другие варианты лучше? Можете ли вы рассказать о том, как именно делается кастинг? – user441660

+0

Я считаю, что кастинг как можно быстрее. Лучше работать над улучшением DoSomething, если у вас проблемы с производительностью. Также рассмотрите возможность использования блокировки на этой линии, если она многопоточная. –