8

这段代码是如何工作的?

      app.InstallStateChanged += (s, e) => UpdateUI();
      NetworkChange.NetworkAddressChanged +=
            (s, e) => UpdateNetworkIndicator();

有人可以解读这个吗?

该代码来自于 Silverlight 4 OOB 系统中使用的示例http://msdn.microsoft.com/en-us/library/dd833066(v=VS.95).aspx

UpdateNetworkIndicator 不返回任何内容。UpdateUI 不返回任何内容。

4

7 回答 7

9

那是一个 lambda 表达式。

“所有 lambda 表达式都使用 lambda 运算符 =>,读作“goes to”。lambda 运算符的左侧指定输入参数(如果有),右侧保存表达式或语句块。lambda 表达式 x => x * x 读作“x 乘以 x”。

http://msdn.microsoft.com/en-us/library/bb397687.aspx

于 2011-09-01T13:26:54.110 回答
9

这是一个包含多个参数的lambda 表达式。在这种情况下(当您使用该函数替换事件处理程序时)它们等效于objectandEventArgs参数。

您的代码等效于以下代码

app.InstallStateChanged += OnInstallStateChanged;
NetworkChange.NetworkAddressChanged += OnNetworkAddressChanged;

/* ... */

private void OnInstallStateChanged(object s, EventArgs e)
{
    UpdateUI();
}

private void OnNetworkAddressChanged(object s, EventArgs e)
{
    UpdateNetworkIndicator();
}
于 2011-09-01T13:28:01.560 回答
6

UpdateUI() 和 UpdateNetworkIndicator() 方法都是自定义事件处理程序方法。

+= 运算符将这些事件处理程序附加到分别由应用程序和 NetworkChange 触发的事件。

=> 表示一个 lambda 表达式。(s,e) 是输入参数(在这种情况下,标准发送者,事件 args), => 的右边是语句或表达式。

在这种情况下,您可以将其重写为:

app.InstallStateChanged += UpdateUI;
NetworkChange.NetworkAddressChanged += UpdateNetworkIndicator;

它应该也能正常工作。

于 2011-09-01T13:30:57.743 回答
2

考虑这个例子

Button1.Click += (s, e) => log(e);

是简写(使用 lambda 表达式)

Button1.Click += new EventHandler(Button1_Click);

void Button1_Click(object sender, EventArgs e)
{
    log(e);
}
于 2011-09-01T13:28:42.703 回答
1

InstallStateChanged 和 NetworkAddressChanged 是事件,您看到的是 lambda 语法,用于定义事件处理程序以在触发相应事件时调用 UpdateUI 或 UpdateNetworkIndicator。

于 2011-09-01T13:27:45.340 回答
1

该语法称为Lambda 表达式。来自 MSDN,

lambda 表达式是一个匿名函数,可以包含表达式和语句,并可用于创建委托或表达式树类型。

以及创建的委托或表达式树的 (s, e)声明输入参数。当有单个输入参数时,不需要括号,您可以只写s => .... 当有多个参数时,需要括号 - (s, e) =>

于 2011-09-01T13:31:24.453 回答
1

简而言之,s 和 e 指的是函数所针对的属性的对象。代码表示:您可以在此函数中访问两种类型的对象。调用此函数时,从 s 对象获取 this 或 that 属性并按以下方式使用其值。

所以在假设的情况下

S 是一个字符串 E 是一个 int

(s, e) =>

意味着函数中的进一步引用通过名称 s 和 e 引用那些相应的对象类型。

(s , e) => s.Length + e

方法:获取 s 所引用的字符串实例的值,并将 e 所引用的 int 实例的值添加到它。

于 2011-09-01T13:37:58.867 回答