【问题标题】:C# add event handler literal code blockC# 添加事件处理程序文字代码块
【发布时间】:2011-09-23 14:39:45
【问题描述】:

是否可以在 C# 中添加文字代码块作为事件处理程序?比如:

Timer t = new Timer(1000);
t.Elapsed += new ElapsedEventHandler({ Console.WriteLine("Tick"); });

您可以在 PowerShell 中执行此操作,所以我认为在 C# 中也可能有一些方法可以执行此操作。

【问题讨论】:

    标签: c# event-handling


    【解决方案1】:

    您可以使用 lambda 表达式(C# 3.0 及更高版本):

    t.Elapsed += (sender, args) => Console.WriteLine("Tick");
    

    或匿名方法(C# 2.0 及更高版本):

    // If you don't need the parameter values
    t.Elapsed += delegate { Console.WriteLine("Tick"); };
    
    // If you do need the parameter values
    t.Elapsed += delegate(Object sender, ElapsedEventArgs args) {
        Console.WriteLine("Tick from {0}", sender); 
    };
    

    【讨论】:

    • 有趣,不知道可以用delegate语法省略参数声明。
    • stackoverflow 礼仪:我应该在这里还是在单独的问题中问“如何删除匿名事件处理程序”?
    • @jmh_gr:搜索它,因为几乎可以肯定之前有人问过 :) (否则,问一个新问题......答案是你将它分配给一个变量,然后订阅并取消订阅相同的变量。)
    • ...在这种情况下,普通的事件处理方法会更容易使用。
    【解决方案2】:
    t.Elapsed += delegate(object sender, ElapsedEventArgs args)
                 { 
                     Console.WriteLine["Tick"]; 
                 });
    

    或者,您也可以使用 lambda 语法:

    t.Elapsed += (sender, args) => { Console.WriteLine["Tick"]; };
    

    【讨论】:

    • 这不会像写的那样工作 - 你需要删除 () 否则它需要一个没有参数的委托类型。
    • @Jon - 是的。在我发布了两个版本之后才意识到这一点。修复了它们。
    猜你喜欢
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多