3

私はこのコードを翻訳しました(外部変数をキャプチャするだけで悪い副作用があります):

foreach (TaskPluginInfo tpi in Values)
{                    
    GenerateMenu(menuStrip, tpi.MenuTree, tpi.MenuText, delegate { tpi.ShowTask() });
}

このコードに(上記が機能していないため):

foreach (TaskPluginInfo tpi in Values)
{                    
    // must capture the variable
    var x = tpi;
    GenerateMenu(menuStrip, tpi.MenuTree, tpi.MenuText, delegate { x.ShowTask(); });
}

そのほとんど知られていない副作用の回避策の正しい用語は何ですか?今のところ、「変数をキャプチャする必要があります」とコメントしました。単語キャプチャ、正しい用語ですか?

4

6 に答える 6

2

さて、tpi と x は両方とも、例の 1 つでキャプチャされる (さまざまな種類の) 変数です... ここでの主なポイントは、キャプチャされた変数 (理想的には) のスコープxをループ内に制限することです。

だから、おそらく; 「反復変数自体ではなく、反復変数のを取得します」

于 2009-07-06T09:49:58.443 に答える
1

実際に行っているのは、反復ごとに反復子の値を含むクロージャー コンテキストを作成することです。このコンテキストは、デリゲートが存在する限り、デリゲートが引き続き使用できます。

あなたが言及している声明をどのように呼びますか? "capture" は良い動詞だと思います。最後に、あなたが何を意味するのかが誰にとっても明らかである限り、それは問題ありません:-)

于 2009-07-06T09:54:33.817 に答える
1

Resharper の警告は、このシナリオを「変更されたクロージャへのアクセス」と呼んでおり、推奨される解決策は「変数をキャプチャする」ことです。そのため、私のコメントでは、「変更されたクロージャへのアクセスを避けるために変数をキャプチャする必要があります」と言います。

于 2009-07-06T12:52:21.137 に答える
0

「反復変数を、ループ内でスコープされるローカル変数に割り当てます」

于 2011-01-18T23:53:56.427 に答える
0

ええ、それはキャプチャです。「closes over」も使用できます。ここにいくつかの例文があります。

GenerateMenu に渡されるデリゲートは、変数 x をキャプチャします。

GenerateMenu に渡されるデリゲートは、x で閉じるラムダです。

また、「自由変数」および「束縛変数」という用語をグーグルで検索することもできます。

于 2009-07-06T10:00:02.573 に答える
0

閉鎖

于 2009-07-06T09:48:21.457 に答える