请教各位﹐我在http://www.dotblogs.com.tw/code6421/archive/2010/08/26/17419.aspx看了Wp7的sample, 但其中有一段语法不懂, 想请大大们指点一下范例中由RIA Service 取得数据
_client.GetCustomersCompleted += (s, args) =>            {
                foreach (var item in args.Result.RootResults) {
                    Items.Add(item);
                }
            };我知道事件的指定是用+=, 但是这个后面直接接(s, args)是什么意思呢? 
看起来像是参数, 但 s 和 args 各指的是什么呢? 什么时候给值呢? 
然后 "=>" 这又是什么意思呢?

解决方案 »

  1.   

    所有 Lambda 表达式都使用 Lambda 运算符=>。 该运算符读为“goes to”。 该 Lambda 运算符的左边是输入参数(如果有),右边包含表达式或语句块
    http://msdn.microsoft.com/zh-cn/library/bb311046.aspx
      

  2.   

    =>  Lambda 运算符
      

  3.   

    _client.GetCustomersCompleted事件加一个处理方法
    后面是Lambda 表达式
      

  4.   

    这种写法蛮好,不受.net框架限制,可以用vs2008编写基于.net 2.0的程序使用lambda。
      

  5.   

    匿名方法的一种写法,无需声明函数,而且还可以直接将当前作用域内的变量带入到Lambda表达式内部使用。
      

  6.   


    可以注销,不过不是很方便而已。
    方法详见
    http://blog.csdn.net/wuyazhe/archive/2010/09/29/5915151.aspx
      

  7.   


    两个方面:第一,是可以获取委托对象的。声明了引用委托的变量EventHandler<GetCustomersCompletedEventArgs> method;之后可以写_client.GetCustomersCompleted +=  method= (s, args) => {
      foreach (var item in args.Result.RootResults) {
      Items.Add(item);
      }
      };
    第二,几乎所有的事件委托都是无需手动撤销的。只有那些注册到不会释放的对象的委托,比如我们把对象X上的一个方法注册为对象K上的一个事件处理程序,而当我们完全不在使用对象X时,对象K却不会释放、一直使用下去,这时候对象X也就无法被GC释放,X上的方法总是会被触发,才需要先去手动撤销这个委托。几乎我们遇到的所有程序,都是不去考虑撤销委托得情况,而是在对象K被使用完的时候就释放它,于是它的所有事件委托的引用就被自动撤销了。
      

  8.   

    正确。
    这是匿名方法,为了简洁使用的表达式Lambda,不需要声明函数。
    是在难于理解可以这样看:
    _client.GetCustomersCompleted += f(s, args);
    void f(s, args)
     {
      foreach (var item in args.Result.RootResults) {
      Items.Add(item);
      }
      

  9.   

    我在补充一下关于“撤销事件委托”,或者我们可以换成两行的代码好了:method= (s, args) => {
      foreach (var item in args.Result.RootResults) {
      Items.Add(item);
      }
      };
    _client.GetCustomersCompleted +=  method;这样method变量就可以用于 -= 操作。这样我们就知道lamda表达式或者匿名委托,用在+=和-=的方面也是很方便的。