The foreach identifier and closures

前端 未结 7 1499
误落风尘
误落风尘 2020-11-22 10:51

In the two following snippets, is the first one safe or must you do the second one?

By safe I mean is each thread guaranteed to call the method on the Foo from the s

7条回答
  •  再見小時候
    2020-11-22 11:09

    Pop Catalin and Marc Gravell's answers are correct. All I want to add is a link to my article about closures (which talks about both Java and C#). Just thought it might add a bit of value.

    EDIT: I think it's worth giving an example which doesn't have the unpredictability of threading. Here's a short but complete program showing both approaches. The "bad action" list prints out 10 ten times; the "good action" list counts from 0 to 9.

    using System;
    using System.Collections.Generic;
    
    class Test
    {
        static void Main() 
        {
            List badActions = new List();
            List goodActions = new List();
            for (int i=0; i < 10; i++)
            {
                int copy = i;
                badActions.Add(() => Console.WriteLine(i));
                goodActions.Add(() => Console.WriteLine(copy));
            }
            Console.WriteLine("Bad actions:");
            foreach (Action action in badActions)
            {
                action();
            }
            Console.WriteLine("Good actions:");
            foreach (Action action in goodActions)
            {
                action();
            }
        }
    }
    

提交回复
热议问题