2

stackoverflowの回答でこのコードを見つけました。は必要なコードを生成しておらず、IntelliSense のそのシンボルは、それが通常のメンバー変数であることを示しているhtmlWeb.PreRequestため、イベント ハンドラーではないようです。+= tab tab

この構文を説明してください。これはイベント ハンドラーですか、それとも何か他のものですか? 私が見+=たのは、通常、イベント ハンドラーを追加するために使用されます。「c# でイベント ハンドラーを追加する方法」などの用語を Google で検索しましたが、そのようなコードは見つかりませんでした。

このコードを理解するのを手伝ってください。このコードの意味は理解できますが、構文は理解できません。他の例をいただければ幸いです。

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;

主な違いは、別のメソッドを宣言する代わりに、ラムダ式の構文を使用することです。リンクされた MSDN 記事で述べられているように、ラムダ構文には次の形式があります。

(input parameters) => expression

したがってrequest =>、コードには入力パラメーターがあります。パラメーターは 1 つしかないため、括弧は省略されています。2つ以上ある場合は、 になります(x,y)=>...

于 2013-06-21T06:04:22.947 に答える
2

PreRequestメソッドではなく、デリゲートです。

http://htmlagilitypack.codeplex.com/SourceControl/latest#Trunk/HtmlAgilityPack/HtmlWeb.cs

したがって、ここで示したラムダは、次のように、現在の要求オブジェクトを正しく処理するために追加の作業が必要かどうかを判断するために、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 に答える