3

次の簡単な例を考えてみましょう。

private Action _action;

public Form1() { InitializeComponent(); }

private void button1_Click(object sender, EventArgs e)
{
    string msg = "test";
    Expression<Action> exp = () => MessageBox.Show(msg);
    _action = exp.Compile();
    msg = "testC";
}

private void button2_Click(object sender, EventArgs e)
{
    _action();
}

button2 をクリックすると、 が表示されますtestC

私の質問は:

後で実行するアクションを保存したい。作成するデリゲートを安全に保存して、compile()必要なときにいつでも使用できますか?

私の質問は主にメソッドの引数に関するものです。それらがどのように(参照または値によって)保存されているか、その間にGCによってクリアできるかどうかはわかりません。一般的に、これが正しいアプローチであるとは思えません。また、msdnはあまり役に立ちません。

優先度の高いアクションの実行をサポートする JobManager を作成しています。デフォルト アクションのスタックと、追加する必要のあるいくつかの優先度の高いアクションがあります。この部分は、優先度の高いジョブを登録する場所です (ラムダを使用 -> メソッドを取得 -> デリゲートを作成 -> 保存 -> 必要に応じて実行)。とにかくこれがアクションを保存するための正しいアプローチであるかどうかはわかりません。

4

1 に答える 1

3

はい、できます。
ラムダ式は、外部関数から使用するローカル変数への参照を保持するクロージャーを作成します。

このクロージャはデリゲートのTargetプロパティで参照されます。
デリゲートへの参照を保持している限り、それらの変数は GC されません。

これがどのように機能するかの詳細については、私のブログ投稿を参照してください。

于 2012-11-06T14:56:06.693 に答える