2015-10-13 100 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); 
    } 
}