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; } }ild
.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