【问题标题】:casting vs parameter passing强制转换与参数传递
【发布时间】:2010-11-09 22:21:42
【问题描述】:

我需要在订阅对象 obj 中的事件的事件处理方法中访问对象 obj(属于某个 ClassA 类型)的 x 和 y 属性。

选项1:只要把这个EventHandler类型的事件,转换为发送者。

无效处理方法(对象发送者,EventArgs e) { ClassA ca = 作为 ClassA 的发送者; 做某事(ca.id,ca.x,ca.y); } RaiseEvent(this,null); //在A类中

选项2: 制作一个 SpecialEventHandler1 以避免强制转换。

无效处理方法(SpecialEventArgs e) { Dosomething(e.id, e.x,e.y); } RaiseSpecialEvent1(new SpecialEventArgs(this.id, this.x,this.y));//在ClassA中

选项3: 制作一个 SpecialEventHandler2,这样就可以避免强制转换和创建新的 SpecialEventArgs 对象。

无效处理方法(A 类发件人) { Dosomething(sender.id, sender.x, sender.y); } RaiseSpecialEvent2(this); //在A类中

假设此事件以@50/秒连续引发。哪个效率更高?它取决于ClassA的大小吗?我假设 Option3 是性能方面的最佳方式。请提供您的见解。

【问题讨论】:

    标签: c# events


    【解决方案1】:

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

    【讨论】:

    • 谢谢@ChaosPandion。但是 500 和 DoSomething 花费大量时间怎么样?您是否说其他选择更好?您能否就具体如何进行投射提供一些见解?
    • 我相信铸造是尽可能即时的。如果你有性能问题,你最好努力改进 DoSomething。另外,如果它是多线程的,请考虑在该行上使用 lock。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 2015-03-17
    • 2019-02-18
    • 2020-12-25
    • 1970-01-01
    相关资源
    最近更新 更多