Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 需要解释如何使用lambda作为事件处理程序吗_C#_Events_Event Handling - Fatal编程技术网

C# 需要解释如何使用lambda作为事件处理程序吗

C# 需要解释如何使用lambda作为事件处理程序吗,c#,events,event-handling,C#,Events,Event Handling,我在一个文件中找到了这段代码htmlWeb.PreRequest似乎不是一个事件处理程序,因为+=tab-tab没有生成所需的代码,它在IntelliSense中的符号告诉我它是一个正常的成员变量 请解释一下这个语法。这是一个事件处理程序还是其他什么?我看到+=通常用于添加事件处理程序。我在Google上搜索了“在c#中添加事件处理程序的方法”之类的术语,但没有找到任何这样的代码 请帮我理解这个代码。我理解这段代码的意思,但不理解语法。任何其他例子都将不胜感激 HtmlWeb htmlWeb =

我在一个文件中找到了这段代码
htmlWeb.PreRequest
似乎不是一个事件处理程序,因为
+=tab-tab
没有生成所需的代码,它在IntelliSense中的符号告诉我它是一个正常的成员变量

请解释一下这个语法。这是一个事件处理程序还是其他什么?我看到
+=
通常用于添加事件处理程序。我在Google上搜索了“在c#中添加事件处理程序的方法”之类的术语,但没有找到任何这样的代码

请帮我理解这个代码。我理解这段代码的意思,但不理解语法。任何其他例子都将不胜感激

HtmlWeb htmlWeb = new HtmlWeb();
htmlWeb.PreRequest += request =>
{
    request.CookieContainer = new System.Net.CookieContainer();
    return true;
};
这是一个例子

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

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

通过使用匿名方法,可以减少中的编码开销 通过不需要创建单独的 方法


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

PreRequest
不是一个方法,而是一个委托:

因此,您所展示的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。

您的代码:

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;
关键的区别在于它使用而不是声明一个单独的方法。正如链接的MSDN artcile lambda语法中所述,其形式如下:

(input parameters) => expression

因此,代码中的
request=>
是输入参数。括号被省略,因为只有一个参数。如果有两个或更多,它将是
(x,y)=>…

关于lambda表达式的非常好的文章更新标题-请随意更改/还原。。。这是不可能找到一个名字的东西,你不知道的名称:)确切地说,我不知道把什么标题。现在搜索起来很容易。Thnx@AlexeiLevenkovI仍然无法找到传递参数的方式。这叫什么<代码>+=请求=>。。?在参数应该放在里面的地方没有括号。我在LINQ中见过这种情况,但从来没有这样过。参数是
request
。如果只有一个参数,则括号是可选的,但它可以像
+=(request)=>…
感谢@horgh的解释那样放置。我还有一个问题,
+=tab-tab
在这里不起作用,那就是我应该如何获得事件处理程序的签名。。?只看纪录片?@对不起,我听不懂你的意思。什么是
选项卡
?您可以按tab按钮使Visual Studio自动生成具有正确签名的单独方法。或者您可以将鼠标悬停在分配的左侧(事件本身),VS应该给出提示…这是您需要的吗?无键序列
+=Tab选项卡
不生成任何代码。VS intellisense1的工具提示中没有提示。您可以使用F12按钮处理声明,并查看代理的类型和签名。2.您可以
+=new
,然后IntelliSense会建议正确的类型…使用它并添加括号3。只是google it
Tab
按钮不起作用,因为
htmlWeb.PreRequest
是一个委托,而不是一个事件。