2015-10-13 101 views
4

任何人能告诉我什么是下面简单英语的代码发生在,特别是围绕=>+=符号用法:语法澄清使用“=>”

var ls = new LibraryServiceClient(AppSettings.Get("LibraryServiceBaseAddress"), 
            SessionId, App.Id, _user.UUID); 
ls.MakingRequest += (s, e) => 
{ 
    LogStash.LogDebug("Library Service | Before making request : {0}", 
    DateTime.UtcNow.ToString("HH:mm:ss.fff")); 
}; 

回答

6
(s,e) => { /*expresion*/ } 

是λ函数。

它的类型是Action<object, EventArgs>

ls.MakingRequest 

是一个事件。

With +=您注册了此事件的处理程序。 当事件被触发时,所有注册的处理程序将执行。

处理程序具有与动作相同的签名 - 它需要发件人objectEventArgs eventArgs并返回void。 因此,lambda函数类型是兼容的,所以它将在事件被触发时被调用。

7

您分配一个新的委托对事件:

ls.MakingRequest += 

创建lambda表达式,具有两个参数,se的函数:

(s, e) => 

凡lambda表达式的操作是:

{ LogStash.LogDebug("Library Service | Before making request : {0}", DateTime.UtcNow.ToString("HH:mm:ss.fff")); 
2

这是一种语法糖,使链式扩展方法看起来更具可读性。

下面的代码将解释它的演变:

public class Program 
{ 
    public void Main(string[] args) 
    { 
     // named delegate 
     Tasker t = new Tasker(); 
     t.doer += DoProvider.DoThis; 
     t.CallDoer("I am doing something"); 

     // anonymous method 
     Tasker t2 = new Tasker(); 
     t2.doer += delegate(string s){ 
      Console.WriteLine (s); 
     }; 
     t2.CallDoer("I am doing something again"); 

     // syntactical sugar over anonymous methods aka lambda expressions 
     Tasker t3 = new Tasker(); 
     t3.doer += (s)=>{ 
      Console.WriteLine (s); 
     }; 
     t3.CallDoer("I am doing yet another thing"); 
    } 
} 


public delegate void DoSomething(string Foo); 

public class Tasker 
{ 
    public event DoSomething doer; 

    public void CallDoer(string s) 
    { 
     doer.Invoke(s); 
    } 
} 

public static class DoProvider 
{ 
    public static void DoThis(string Bar) 
    { 
     Console.WriteLine (Bar); 
    } 
}