2013-06-21 60 views
2

我在answer on stackoverflow中發現了這段代碼。 htmlWeb.PreRequest似乎不是事件處理程序,因爲+= tab tab未生成所需的代碼,並且它在IntelliSense中的符號告訴我它是一個正常的成員變量。需要使用lambda作爲事件處理程序的說明

請解釋這個語法。這是一個事件處理程序還是其他的東西?我見過+=通常用於添加事件處理程序。我在Google上搜索了諸如「在c#中添加事件處理程序的方式」,但找不到任何這樣的代碼。

請幫我理解這段代碼。我理解這段代碼的含義,但不是語法。任何其他例子將不勝感激。

HtmlWeb htmlWeb = new HtmlWeb(); 
htmlWeb.PreRequest += request => 
{ 
    request.CookieContainer = new System.Net.CookieContainer(); 
    return true; 
}; 
+2

關於lambda表達式的很好的文章http://www.codeproject.com/Articles/507985/Way-to-Lambda – WhileTrueSleep

+0

已更新的標題 - 隨時更改/恢復...它是不可能找到一個名字的東西你不知道名字:) –

+0

確切地說,我不知道該怎麼稱呼。現在很容易搜索。 Thnx @AlexeiLevenkov – shashwat

回答

5

您的代碼:

HtmlWeb htmlWeb = new HtmlWeb(); 
htmlWeb.PreRequest += request => 
{ 
    request.CookieContainer = new System.Net.CookieContainer(); 
    return true; 
}; 

實際上是quivalent到:

bool PreRequest_EventHandler(HttpWebRequest request) 
{ 
    request.CookieContainer = new System.Net.CookieContainer(); 
    return true; 
} 
//... 
HtmlWeb htmlWeb = new HtmlWeb(); 
htmlWeb.PreRequest += PreRequest_EventHandler; 

的主要區別是,它使用的lambda expressions syntax聲明,而不是一個單獨的方法。由於它在鏈接MSDN artcile lambda語法據說有以下形式:

(input parameters) => expression 

所以request =>在你的代碼是輸入參數。由於只有一個參數,因此省略括號。如果有兩個或更多,那將是(x,y)=>...

+0

謝謝@horgh的解釋。我仍然有一個問題,'+ = tab tab'在這裏不起作用,而不是我應該如何獲得Event Handler的簽名。只有閱讀文件..? – shashwat

+0

@哈哈抱歉,我無法理解你的意思。什麼是「標籤」?您可以按* tab *按鈕爲Visual Studio自動生成具有正確簽名的單獨方法。或者你可以將鼠標懸停在任務的左側(事件本身),VS應該給出提示......這是你需要的嗎? – horgh

+0

沒有鍵序列'+ = Tab Tab''不生成任何代碼。 VS智能感知工具提示中沒有提示 – shashwat

0

這是一個Anonymous Methods (C# Programming Guide)

一個例子在C#之前的2.0版本中,只有這樣才能聲明一個代理 是使用命名方法。 C#2.0引入了匿名方法。

創建匿名方法本質上是一種將代碼塊 作爲委託參數傳遞的方法。

通過使用匿名方法,你不再需要創建一個單獨的 方法減少 實例代表編碼開銷。

所以,基本上,這是使用匿名方法作爲事件處理程序。

+0

我仍然無法找到傳遞參數的方式。這個叫什麼..? '+ =請求=>'..?沒有括號將參數保存在裏面。我在LINQ中看到了這個,但從來沒有這樣。 – shashwat

+0

參數是'request'。如果只有一個參數,括號是可選的,但它可以像'+ =(request)=> ...' –

2

PreRequest不是方法,而是一個委託:

http://htmlagilitypack.codeplex.com/SourceControl/latest#Trunk/HtmlAgilityPack/HtmlWeb.cs

所以,你只需所示的拉姆達分配給說,由HtmlAgilityPack內部使用的委託,以確定是否某些匿名方法額外的工作,需要正確地處理當前的請求對象,如下所示:

if (PreRequest != null) 
{ 
    // allow our user to change the request at will 
    if (!PreRequest(req)) 
    { 
     return HttpStatusCode.ResetContent; 
    } 
} 

當條件if(!PreRequest(req))...進行評價時,它使用的匿名的方法,其中廣告將一些額外的「東西」添加到當前的請求對象中,然後返回true(其中!然後否定),所以HAP知道並不是的返回。

如果不是全部清楚,不提供請求對象。 HAP確實,在Get()方法,其中正在使用該委託:

req = WebRequest.Create(uri) as HttpWebRequest; 

你的委託基本上只是提供一個方法體潛在的做一些事情該請求,然後返回true或false。

相關問題