2013-06-21 63 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。

相关问题