我应该使用多个事件还是更冗长的eventargs类?

时间:2012-05-16 14:45:18

标签: c# events eventargs

我的程序在串口上接收数据,收到数据后,可以用八种不同的方式解释。

如果我想在收到数据后触发事件,我应该使用一个事件并在我的自定义事件arg类中使用枚举,还是应该创建8个单独的事件?基本上我想知道创建事件的惯例是什么。

我的假设是,当一个新事件与当前事件有区别时,应该创建一个新事件,但我不确定哪个方法可以用我的例子。

编辑:为了澄清这种情况,该程序主要通过串口与设备通信,接收输入的方法如下:

我应该这样做吗?

void receive(byte[] somebytes)
{
    // After checking to make sure all bytes expected are received
    switch(somecase)
    {
        case 0: TriggerEvent(SomeEventArgs);break;
        case 1: TriggerEvent(SomeEventArgs);break;
        case 2: TriggerEvent(SomeEventArgs);break;
        case 3: TriggerEvent(SomeEventArgs);break;
        case 4: TriggerEvent(SomeEventArgs);break;
        case 5: TriggerEvent(SomeEventArgs);break;
        case 6: TriggerEvent(SomeEventArgs);break;
        case 7: TriggerEvent(SomeEventArgs);break;
        case 8: TriggerEvent(SomeEventArgs);break;
    }
}

或者这个:

void receive(byte[] somebytes)
{
    // After checking to make sure all bytes expected are received
    switch(somecase)
    {
        case 0: Event0(LessEventArgs);break;
        case 1: Event1(LessEventArgs);break;
        case 2: Event2(LessEventArgs);break;
        case 3: Event3(LessEventArgs);break;
        case 4: Event4(LessEventArgs);break;
        case 5: Event5(LessEventArgs);break;
        case 6: Event6(LessEventArgs);break;
        case 7: Event7(LessEventArgs);break;
        case 8: Event8(LessEventArgs);break;
    }
}

4 个答案:

答案 0 :(得分:1)

这取决于你正在做什么以及你的计划的更大背景。这可能是一个风格问题,但可以这样想:如果你处理常规变量而不是事件,将它们分成八个不同的类是否更好,或者让它们全部使用它们会更好但是有八个不同的值?

答案 1 :(得分:1)

这两种解决方案都有效,但我认为举办一次举重活动要容易得多。

如果您只有一个活动,则只需在班级中定义一个唯一的EventArgs<T>发布单个活动,并处理单个活动。

决定做什么的所有逻辑都在“客户端类”中,这些逻辑可以归结为事件。这样可以更容易地进行测试和调试。

所以你需要:

  • 发布单个事件的类
  • 处理该事件并将执行分派给正确方法的方法,具体取决于事件arg
  • 处理8个案件中的每一个的方法。

如果你这样做,很容易创建一个单元测试来测试调度程序方法,并且不同的单元测试来测试这8个方法中的每一个。

您的“服务器类”依赖于外部资源很简单。这很重要,因为在8个事件之间选择的调度员调试测试很困难。

想想另一个实现,使用8个事件:你会得到一个更混乱,更难以测试和调试代码。

作为旁注,我建议您阅读有关"C# Event Implementation Fundamentals, Best Practices and Conventions"

的详尽文章

答案 2 :(得分:1)

我个人的偏好是'少即是多'的方法,我会创建一个事件,将Enum传递给你所描述的事件。

我会将此与.NET库中的KeyPressDown进行比较以进行桌面开发。没有AKeyPressedBKeyPressedEnterKeyPressed - 它被封装在一个方法中,以实现简洁直观的实现。

答案 3 :(得分:0)

不知道你的程序究竟是什么样的,有点难以判断。但我建议你创建8个单独的事件来保持概述,并防止使用事件处理程序方法。