2

我在 stackoverflow 的答案中找到了这段代码。htmlWeb.PreRequest似乎不是事件处理程序,因为+= tab tab没有生成所需的代码,并且它在 IntelliSense 中的符号告诉我它是一个普通的成员变量。

请解释这个语法。这是一个事件处理程序还是别的什么?我见过+=通常用于添加事件处理程序。我在 Google 上搜索了诸如“在 c# 中添加事件处理程序的方法”之类的术语,但找不到任何此类代码。

请帮助我理解这段代码。我了解此代码的含义,但不了解语法。任何其他示例将不胜感激。

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

3 回答 3

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 表达式语法而不是声明单独的方法。正如链接的 MSDN 文章中所说,lambda 语法具有以下形式:

(input parameters) => expression

所以request =>在你的代码中是输入参数。括号被省略,因为只有一个参数。如果有两个或更多,那就是(x,y)=>...

于 2013-06-21T06:04:22.947 回答
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。

于 2013-06-21T05:58:54.680 回答
0

这是匿名方法的示例(C# 编程指南)

在 2.0 之前的 C# 版本中,声明委托的唯一方法是使用命名方法。C# 2.0 引入了匿名方法。

创建匿名方法本质上是一种将代码块作为委托参数传递的方法。

通过使用匿名方法,您无需创建单独的方法,从而减少了实例化委托的编码开销。

所以,基本上,这是使用匿名方法作为事件处理程序。

于 2013-06-21T05:18:26.067 回答