4

アプリケーション内のコードのブロックが何をするのか理解しようとしていますが、理解できない C# に出くわしました。

以下のコードで、「controller.Progress +=」行の後のコードは何をしますか?

私はこれまでこの構文を見たことがなく、構造が何と呼ばれているのかわからないため、この構文が何を意味するのか、何をするのかをグーグルで調べることはできません。たとえば、値 s と p は何ですか? それらはプレースホルダーですか?

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    using (var controller = new ApplicationDeviceController(e.Argument as SimpleDeviceModel))
    {
        controller.Progress += 
           (s, p) => { (sender as BackgroundWorker).ReportProgress(p.Percent); };
        string html = controller.GetAndConvertLog();
        e.Result = html;
    }
}

関数をイベントにアタッチしているように見えますが、構文 (または s と p とは何か) を理解していないだけで、そのコードには有用な intellsense がありません。

4

4 に答える 4

6

これは、イベント ハンドラーに割り当てられるラムダ式です。

S と P は、関数に渡される変数です。基本的に、2 つのパラメーターを受け取る名前のない関数を定義しています。C# は、controller.Progress イベントが int 型と object 型の 2 つのパラメーターを持つメソッド ハンドラーを想定していることを認識しているため、2 つの変数がこれらの型であると自動的に想定します。

これを次のように定義することもできます

controller.Progress += (int s, object p)=> { ... }

代わりにメソッド定義がある場合と同じです。

controller.Progress += DoReportProgress;
....
public void DoReportProgress(int percentage, object obj) { .... }
于 2013-05-14T14:16:10.233 に答える
3

Progressのイベントを配線してcontrollerBackgroundWorker's ReportProgress

より具体的に(s, p)は、次のようなイベント ハンドラーのメソッド パラメーター シグネチャです。(object Sender, EventArgs e)

ラムダ式を見る

于 2013-05-14T14:14:57.883 に答える
3

これは匿名関数と呼ばれます。

無名関数は、デリゲート型が必要な場所ならどこでも使用できる "インライン" ステートメントまたは式です。これを使用して、名前付きデリゲートを初期化するか、名前付きデリゲート型の代わりにメソッド パラメーターとして渡すことができます。

あなたのシナリオでは、基本的にProgressイベントを配線して関数をトリガーしていReportProgessます。

通常は、次のように記述します。

controller.Progress += new EventHandler(delegate (object sender, EventArgs a) {
    (sender as BackgroundWorker).ReportProgress(p.Percent);
});
于 2013-05-14T14:16:50.643 に答える
3

実際、このコードはラムダ exp をイベントに割り当てます。コンパイル時に、次のようにデリゲートとして変換されます。

controller.Progress += new EventHandler(delegate (Object o, EventArgs a) {
a.ReportProgress(p.Percent);
            });
于 2013-05-14T14:18:51.353 に答える