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

C# 这行C代码实际上是做什么的?,c#,events,delegates,C#,Events,Delegates,我试图理解应用程序中的一块代码是做什么的,但我遇到了一些C语言,我就是不懂 在下面的代码中,“controller.Progress+=”行后面的代码做什么 我以前没有见过这种语法,因为我不知道这些结构被称为什么,所以我无法通过谷歌搜索任何东西来了解这种语法的含义或作用。例如,s和p的值是什么?它们是占位符吗 private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) { using (var contro

我试图理解应用程序中的一块代码是做什么的,但我遇到了一些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是什么),而且代码中没有有用的智能

它连接
控制器的
进度
事件,以触发
后台工作人员的
报告进度

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


请参见

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

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

您也可以将其定义为

controller.Progress += (int s, object p)=> { ... }
这与使用方法定义相同:

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

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

在您的场景中,它基本上是连接
Progress
事件以触发
reportprogress
功能

通常情况下,它的书写方式如下:

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

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

controller.Progress += new EventHandler(delegate (Object o, EventArgs a) {
a.ReportProgress(p.Percent);
            });
请注意,由于如果转换失败,
(发送方作为BackgroundWorker)
将为null,并将立即导致null引用异常,因此这样编写它将更好地表达意图(如果失败,并给出一个更有意义的异常):
{((BackgroundWorker)发送方.ReportProgress(p.Percent);}