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

本文关键字:什么 实际上 代码 这行 | 更新日期: 2023-09-27 18:13:35

我试图理解应用程序中的代码块是做什么的,但是我遇到了一些我不理解的c#。

在下面的代码中,"controller"后面的代码是什么?进度+="行怎么办? "

我以前没有见过这种语法,因为我不知道这些结构被称为什么,我不能谷歌任何东西来找出这种语法的意思或作用。比如,值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是什么),并且在该代码上没有有用的智能感。

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

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

S和p是传递给函数的变量。你基本上定义了一个无名函数,它接收两个参数。因为c#知道控制器。Progress事件需要一个带有int和object两个类型参数的方法处理程序,它自动假定这两个变量属于这两个类型。

也可以定义为

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

这就好像你有一个方法定义:

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

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

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

这是一个匿名函数

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

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

通常会写成这样:

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

连接controllerProgress事件来触发BackgroundWorker's ReportProgress

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

参见lambda表达式