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