public string[] Tables = new string[] { "One", "Two", "Three" }; >>> >>> >>> public void UseTables() >>> { >>> foreach (string s in Tables) >>> { >>> //Do something >>> System.Threading.Thread.Sleep(1000); >>> } >>> } >>> >>> public void LoadDataDictionary() >>> { >>> string[] tables = new string[]{"One","Two"}; >>> Tables = tables; >>> } >>>If, for example, LoadDataDictionary() runs on one thread whilst UseTables() is running on another you've got problems...
>> public class AClass >> { >> public static string[] Tables; >> >> public static void Main() >> { >> TestWithEnumerator(); >> TestWithForEach(); >> } >> >> static void TestWithEnumerator() >> { >> InitializeTables(); >> var enumerator = Tables.GetEnumerator(); >> while (enumerator.MoveNext()) >> { >> Console.WriteLine(enumerator.Current); >> ReInitializeTables(); >> } >> Console.ReadLine(); >> } >> static void TestWithForEach() >> { >> InitializeTables(); >> foreach (var x in Tables ) >> { >> Console.WriteLine(x); >> ReInitializeTables(); >> } >> Console.ReadLine(); >> } >> >> public static void InitializeTables() >> { >> string[] tables = new string[] { "one", "two", "three" }; >> Tables = tables; >> } >> >> public static void ReInitializeTables() >> { >> string[] tables = new string[] { "four", "five" }; >> Tables = tables; >> } >> } >>>>
>>.method private hidebysig static void TestWithForEach() cil managed >>{ >> // Code size 58 (0x3a) >> .maxstack 2 >> .locals init ([0] string x, >> [1] string[] CS$6$0000, >> [2] int32 CS$7$0001, >> [3] bool CS$4$0002) >> IL_0000: nop >> IL_0001: call void CoreTest.AClass::InitializeTables() >> IL_0006: nop >> IL_0007: nop >> IL_0008: ldsfld string[] CoreTest.AClass::Tables loads static field Tables on the stack >> IL_000d: stloc.1 and stores it locally >> IL_000e: ldc.i4.0 >> IL_000f: stloc.2 >> IL_0010: br.s IL_0029 >> IL_0012: ldloc.1 >> IL_0013: ldloc.2 >> IL_0014: ldelem.ref >> IL_0015: stloc.0 >> IL_0016: nop >> IL_0017: ldloc.0 >> IL_0018: call void [mscorlib]System.Console::WriteLine(string) >> IL_001d: nop >> IL_001e: call void CoreTest.AClass::ReInitializeTables() >> IL_0023: nop >> IL_0024: nop >> IL_0025: ldloc.2 >> IL_0026: ldc.i4.1 >> IL_0027: add >> IL_0028: stloc.2 >> IL_0029: ldloc.2 >> IL_002a: ldloc.1 >> IL_002b: ldlen >> IL_002c: conv.i4 >> IL_002d: clt >> IL_002f: stloc.3 >> IL_0030: ldloc.3 >> IL_0031: brtrue.s IL_0012 >> IL_0033: call string [mscorlib]System.Console::ReadLine() >> IL_0038: pop >> IL_0039: ret >>} // end of method AClass::TestWithForEach >>Interesting. It's cleverer than I thought. But :
static void TestWithForEach() > { > int l = Tables.Length; > ReInitializeTables(); > Console.WriteLine(Tables[l]); > > Console.ReadLine(); > }Would fail - even without ReInitializeTables()