此代码如何运作?
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不会返回任何内容。
答案 0 :(得分:9)
这是一个lambda表达式。
“所有lambda表达式都使用lambda运算符=>,其读作为 “去”。 lambda运算符的左侧指定输入 参数(如果有的话)和右侧包含表达式或 声明块。 lambda表达式x =>读取x * x“x转到x 次x。“
答案 1 :(得分:9)
这是包含多个参数的lambda expression。在这种情况下(当您使用函数替换事件处理程序时),它们等同于object
和EventArgs
参数。
您的代码等同于以下
app.InstallStateChanged += OnInstallStateChanged;
NetworkChange.NetworkAddressChanged += OnNetworkAddressChanged;
/* ... */
private void OnInstallStateChanged(object s, EventArgs e)
{
UpdateUI();
}
private void OnNetworkAddressChanged(object s, EventArgs e)
{
UpdateNetworkIndicator();
}
答案 2 :(得分:6)
UpdateUI()和UpdateNetworkIndicator()方法都是自定义事件处理程序方法。
+ =运算符将这些事件处理程序分别附加到app和NetworkChange触发的事件中。
=>表示lambda表达式。 (s,e)是输入参数(在这种情况下,标准发送者,事件参数)和右侧=>是陈述或表达。
在这种情况下,您可以将其重写为:
app.InstallStateChanged += UpdateUI;
NetworkChange.NetworkAddressChanged += UpdateNetworkIndicator;
它应该也能正常工作。
答案 3 :(得分:2)
考虑这个例子
Button1.Click += (s, e) => log(e);
是
的简写(使用lambda表达式)Button1.Click += new EventHandler(Button1_Click);
和
void Button1_Click(object sender, EventArgs e)
{
log(e);
}
答案 4 :(得分:1)
InstallStateChanged和NetworkAddressChanged是Events,你看到的是用于定义eventhandler以调用UpdateUI或UpdateNetworkIndicator的lambda语法,如果相应的事件被触发。
答案 5 :(得分:1)
该语法称为Lambda Expression。来自MSDN,
lambda表达式是一个可以包含的匿名函数 表达式和语句,可用于创建委托或 表达式树类型。
(s, e)
声明创建的委托或表达式树的输入参数。如果有单个输入参数,则不需要括号,只能编写s => ...
。如果有多个参数,则需要括号 - (s, e) =>
。
答案 6 :(得分:1)
简而言之,s和e引用了函数所针对的属性的对象。代码表达:您可以在此函数中访问两种类型的对象。调用此函数时,从s对象获取此属性或该属性,并按以下方式使用其值。
所以在假设的背景下
S是一个字符串 E是一个int
(s,e)=>
表示函数中的进一步引用是通过名称s和e引用那些相应的对象类型。
(s,e)=> s.Length + e
表示:获取s引用的字符串实例的值,并将e引用的int实例的值添加到其中。