我在stackoverflow上的一个回答中发现了这段代码。htmlWeb.PreRequest
似乎不是事件处理程序,因为+= tab tab
没有生成所需的代码,并且它在智能感知中的符号告诉我它是一个正常的成员变量。
请解释这个语法。这是一个事件处理程序还是别的什么?我看到+=
通常用于添加事件处理程序。我在谷歌上搜索了"在c#中添加事件处理程序的方法"之类的术语,但找不到任何这样的代码。
请帮助我理解这段代码。我懂这段代码的意思,但不懂语法。如有其他例子,我将不胜感激。
HtmlWeb htmlWeb = new HtmlWeb();
htmlWeb.PreRequest += request =>
{
request.CookieContainer = new System.Net.CookieContainer();
return true;
};
代码:
HtmlWeb htmlWeb = new HtmlWeb();
htmlWeb.PreRequest += request =>
{
request.CookieContainer = new System.Net.CookieContainer();
return true;
};
实际上相当于:
bool PreRequest_EventHandler(HttpWebRequest request)
{
request.CookieContainer = new System.Net.CookieContainer();
return true;
}
//...
HtmlWeb htmlWeb = new HtmlWeb();
htmlWeb.PreRequest += PreRequest_EventHandler;
关键的区别在于它使用lambda表达式语法而不是声明一个单独的方法。正如链接的MSDN文章中所说,lambda语法具有以下形式:
(input parameters) => expression
因此,代码中的request =>
是输入参数。括号省略,因为只有一个参数。如果有两个或更多,则为(x,y)=>...
。
PreRequest
不是一个方法,而是一个委托:
http://htmlagilitypack.codeplex.com/SourceControl/latest树干/HtmlAgilityPack HtmlWeb.cs
因此,您所展示的lambda只是将一个匿名方法分配给上述委托,该委托由htmllagilitypack在内部使用,以确定是否需要一些额外的工作来正确处理当前请求对象,如下所示:
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
这是一个匿名方法(c#编程指南)的例子
在2.0之前的c#版本中,声明委托的唯一方法就是使用命名方法。c# 2.0引入了匿名方法
创建匿名方法本质上是传递代码块的一种方式作为委托参数。通过使用匿名方法,可以减少代码开销实例化委托,无需创建单独的方法。
基本上,这是使用一个匿名方法作为事件处理程序