我在answer on stackoverflow中找到了这段代码。 htmlWeb.PreRequest
似乎不是一个事件处理程序,因为+= tab tab
没有生成所需的代码,而且它在IntelliSense中的符号告诉我它是一个普通的成员变量。
请解释一下这种语法。这是一个事件处理程序还是其他的东西?我看到+=
通常用于添加事件处理程序。我在Google上搜索了“在c#中添加事件处理程序的方法”等术语,但找不到任何此类代码。
请帮我理解这段代码。我理解这段代码的含义,但不理解语法。任何其他的例子将不胜感激。
HtmlWeb htmlWeb = new HtmlWeb();
htmlWeb.PreRequest += request =>
{
request.CookieContainer = new System.Net.CookieContainer();
return true;
};
答案 0 :(得分:5)
您的代码:
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 expressions syntax而不是声明一个单独的方法。正如在链接的MSDN中所说,artcile lambda语法具有以下形式:
(input parameters) => expression
因此代码中的request =>
是输入参数。括号被省略,因为只有一个参数。如果有两个或更多,则为(x,y)=>...
。
答案 1 :(得分:2)
PreRequest
不是方法,而是委托:
http://htmlagilitypack.codeplex.com/SourceControl/latest#Trunk/HtmlAgilityPack/HtmlWeb.cs
因此,您所展示的lambda只是为所述委托分配一个匿名方法,该委托由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。
答案 2 :(得分:0)
这是Anonymous Methods (C# Programming Guide)
的示例在2.0之前的C#版本中,声明委托的唯一方法 是使用命名方法。 C#2.0引入了匿名方法。
创建匿名方法本质上是一种传递代码块的方法 作为委托参数。
通过使用匿名方法,可以减少编码开销 通过消除创建单独的代理来实例化委托 方法
所以,基本上,这是使用Anonymous方法作为事件处理程序。