3

クロージャは、囲まれた変数の値ではなく、参照に近いことを理解しています。それは私の質問ではありません。「このタスクに、実行時ではなく、作成時に表示されるこの値を与える」ことを(コンパイラーに)表現する方法を知りたいです。

言い換えれば、どうすれば取得できますか

static void Main(string[] args)
{
    var userName = "Alice";
    var task = new Task(() =>
    {
        Console.WriteLine("User is: " + userName);
    });

    // continues work ...
    userName = "Zoltan";
    task.Start();
    Console.ReadLine();
}

印刷する

User is: Alice

それが今していることの代わりに、すなわち

User is: Zoltan

避けようとしている

Task.Factory.StartNew((copy) =>
{
     Console.WriteLine("User is: " + (string)copy);
}, userName); 

これにより、すべての状態オブジェクト(userNameなど)を実際のラムダ内の対応する型に再キャストする必要があります。これは、StartNewメソッドインターフェイスobjectがジェネリックインターフェイス(例:)ではなく型のオブジェクトを定義しているため<T>です。上記のデモの例は、文字列と1つの書き込み行で問題ないように見えますが、大きなオブジェクトを使用して画面一杯のコード全体に再キャストする実際の状況では、少し無駄があります(エラーが発生しやすくなります)。

4

1 に答える 1