c# - Lambda variable capture in loop - what happens here? -


i trying head around, happens here ? sort of code compiler produce?

public static void vc() {     var listactions = new list<action>();      foreach (int in enumerable.range(1, 10))     {         listactions.add(() => console.writeline(i));     }      foreach (action action in listactions)     {         action();     } }  static void main(string[] args) {    vc(); } 

output: 10 10 .. 10

according this, new instance of actionhelper created every iteration. in case, assume should print 1..10. can give me pseudo code of compiler doing here ?

thanks.

in line

 listactions.add(() => console.writeline(i)); 

the variable i, captured, or if wish, created pointer memory location of variable. means every delegate got pointer memory location. after loop execution:

foreach (int in enumerable.range(1, 10)) {     listactions.add(() => console.writeline(i)); } 

for obvious reasons i 10, memory content pointers present in action(s) pointing, becomes 10.

in other words, i captured.

by way, should note, according eric lippert, "strange" behaviour resolved in c# 5.0.

so in c# 5.0 program print as expected:

1,2,3,4,5...10 

edit:

can not find eric lippert's post on subject, here one:

closure in loop revisited


Popular posts from this blog

php - How should I create my API for mobile applications (Needs Authentication) -

5 Reasons to Blog Anonymously (and 5 Reasons Not To)

Google AdWords and AdSense - A Dynamic Small Business Marketing Duo