需要解释使用lambda作为事件处理程序

时间:2013-06-21 05:15:34

标签: c# events event-handling

我在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;
};

3 个答案:

答案 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方法作为事件处理程序。