我需要在订阅对象obj中的事件的事件处理方法中访问对象obj(类型为某种ClassA)的x和y属性。
选项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
选项2: 创建一个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 :(得分: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);
});
}