施法与参数传递

时间:2010-11-09 22:21:43

标签: c# events

我需要在订阅对象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是性能方面的最佳方式。请提供您的见解。

1 个答案:

答案 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);
    });
}