c# - 样板代码替换——这段代码有什么不好的地方吗?

标签 c# coding-style

我最近创建了这两个(不相关的)方法来替换我的 winforms 应用程序中的大量样板代码。据我所知,它们工作正常,但我需要一些保证/建议,看看是否存在我可能遗漏的问题。

(凭内存)

static class SafeInvoker
{
    //Utility to avoid boiler-plate InvokeRequired code
    //Usage: SafeInvoker.Invoke(myCtrl, () => myCtrl.Enabled = false);
    public static void Invoke(Control ctrl, Action cmd)
    {
        if (ctrl.InvokeRequired)
            ctrl.BeginInvoke(new MethodInvoker(cmd));
        else
            cmd();
    }

    //Replaces OnMyEventRaised boiler-plate code
    //Usage: SafeInvoker.RaiseEvent(this, MyEventRaised)
    public static void RaiseEvent(object sender, EventHandler evnt)
    {
        var handler = evnt;
        if (handler != null)
            handler(sender, EventArgs.Empty);
    }
}

编辑:参见相关问题 here

更新

继死锁问题(与 this question 相关)之后,我已从 Invoke 切换到 BeginInvoke(参见解释 here)。

另一个更新

关于第二个片段,我越来越倾向于使用“空委托(delegate)”模式,它通过直接用空处理程序声明事件来“从源头”解决这个问题,如下所示:

event EventHandler MyEventRaised = delegate {};

最佳答案

这是个好东西。尽管使它们成为扩展方法以进一步清理您的代码。例如:

//Replaces OnMyEventRaised boiler-plate code
//Usage: SafeInvoker.RaiseEvent(this, MyEventRaised)
public static void Raise(this EventHandler eventToRaise, object sender)
{
            EventHandler eventHandler = eventToRaise;

            if (eventHandler != null)
                eventHandler(sender, EventArgs.Empty);
}

现在在你的事件中你可以调用:myEvent.Raise(this);

关于c# - 样板代码替换——这段代码有什么不好的地方吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/192980/

相关文章:

c# - 从数组值声明 "variable variables"或 "dynamic variables"?

user-interface - 您是否使用与私有(private)变量相同的约定来命名表单上的控件?

c# - 改变WinForm边框的样式?

refactoring - 您能容忍多少重复代码?

c# - 您是否在任何地方都使用 1-3 个字母的变量?

c# - IEnumerable<T> 和 "yield return"性能问题

c# - 如何使用具有复杂类型的自动映射器

java - Java 中本地集合的类型约定

c# - 如何在 ASP.NET MVC 中获取不带参数的 Action 的 URL

c# - 我如何控制对象如何被哈希集哈希