在C#中重用事件处理程序的良好实践

Pet*_*teT 4 .net c#

在我当前的项目中,我在不同的选项卡中使用了四个网格视图.随着系统的开发,它们有一些共享方法,例如显示自定义工具提示和行时的右键菜单.

我现在正在进行代码清理练习.我在下面看到的是,我现在有四个事件处理程序调用相同的方法.是否可以将事件处理程序更改为直接指向GridMenu,从而避免额外的代码?这会在以后的开发中引起我的问​​题吗?

显然目前我使用默认的偶数处理程序名称.

private void grdEnquiriesLevel1_ShowGridMenu(object sender, GridMenuEventArgs e)
    {
        GridMenu(sender, e);
    }

    private void grdApplicantsLevel1_ShowGridMenu(object sender, GridMenuEventArgs e)
    {
        GridMenu(sender, e);
    }

    private void grdApplicationsLevel1_ShowGridMenu(object sender, GridMenuEventArgs e)
    {
        GridMenu(sender, e);
    }

    private void grdInterviewsLevel1_ShowGridMenu(object sender, GridMenuEventArgs e)
    {
        GridMenu(sender, e);
    }

    private void GridMenu(object sender, GridMenuEventArgs e)
    {
        GridView view = (GridView)sender;

        if (view.CalcHitInfo(e.Point).InRow)
            popupMenu1.ShowPopup(Cursor.Position);
    }
Run Code Online (Sandbox Code Playgroud)

dan*_*die 10

而不是直接注册GridMenu,创建一个名为的通用事件处理程序Grid_ShowGridMenu.

只需为每个网格注册相同的事件处理程序,而不是为每个网格创建单独的事件处理程序.

grdEnquiriesLevel1.ShowGridMenu += Grid_ShowGridMenu;
grdApplicantsLevel1.ShowGridMenu += Grid_ShowGridMenu;
grdApplicationsLevel1.ShowGridMenu += Grid_ShowGridMenu;
grdInterviewsLevel1.ShowGridMenu += Grid_ShowGridMenu;


private void Grid_ShowGridMenu(object sender, GridMenuEventArgs e)
{
    GridMenu((GridView)sender, e.Point); 
}
Run Code Online (Sandbox Code Playgroud)

现在,不是sender, e直接传递给GridMenu,只传递必要的GridMenu并更改签名,GridMenu因此它可以更加可重用.

private void GridMenu(GridView grid, Point hitPoint) 
{
    if (grid.CalcHitInfo(hitPoint).InRow)
        popupMenu1.ShowPopup(Cursor.Position);
}
Run Code Online (Sandbox Code Playgroud)