这行C#代码实际上做了什么?

时间:2013-05-14 14:13:01

标签: c# events delegates

我试图了解应用程序中的代码块是什么,但我遇到了一些C#,我只是不明白。

在下面的代码中,“controller.Progress + =”行之后的代码是做什么的?

之前我没有看过这种语法,因为我不知道这些结构是什么,我不能谷歌任何东西来找出这种语法的意思或作用。例如,值s和p是什么?他们是占位符吗?

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    using (var controller = new ApplicationDeviceController(e.Argument as SimpleDeviceModel))
    {
        controller.Progress += 
           (s, p) => { (sender as BackgroundWorker).ReportProgress(p.Percent); };
        string html = controller.GetAndConvertLog();
        e.Result = html;
    }
}

看起来它正在将一个函数附加到一个事件,但我只是不理解语法(或者s和p是什么),并且在该代码上没有有用的intellsense。

4 个答案:

答案 0 :(得分:6)

这是一个分配给事件处理程序的lambda表达式。

S和P是传递给函数的变量。你基本上定义了一个无名函数,它接收两个参数。因为C#知道controller.Progress事件需要一个方法处理程序,它有两个int和object类型的参数,所以它会自动假设这两个变量属于那些类型。

您也可以将其定义为

controller.Progress += (int s, object p)=> { ... }

就像你有一个方法定义一样:

controller.Progress += DoReportProgress;
....
public void DoReportProgress(int percentage, object obj) { .... }

答案 1 :(得分:3)

它将Progress controller事件连接起来,以触发BackgroundWorker's ReportProgress

更具体地说,(s, p)是事件处理程序的方法参数签名,如(object Sender, EventArgs e)

请参阅lambda expressions

答案 2 :(得分:3)

它被称为Anonymous Function

  

匿名函数是一种“内联”语句或表达式,可以在需要委托类型的任何地方使用。您可以使用它来初始化命名委托,或者将其作为方法参数传递而不是命名委托类型。

在您的方案中,它基本上是连接您的Progress事件以触发ReportProgess功能。

通常,它会写成:

controller.Progress += new EventHandler(delegate (object sender, EventArgs a) {
    (sender as BackgroundWorker).ReportProgress(p.Percent);
});

答案 3 :(得分:3)

实际上,此代码将lambda exp分配给事件。在编译时,它将被转换为代理,如下所示,

controller.Progress += new EventHandler(delegate (Object o, EventArgs a) {
a.ReportProgress(p.Percent);
            });