Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can someone explain "access to modified closure" in C# in simple terms? [duplicate]

Tags:

closures

c#

Possible Duplicate:
What is a 'Closure'?
Access to Modified Closure
Access to Modified Closure (2)

Resharper is complaining about the following piece of code:

foreach (string data in _dataList)
    DoStuff (() => field);

What is a closure? And why should I care?

I've read about closure in maths and functional programming and I'm at a loss here. Too heavy for my brain.

In simpler terms, what is going on here?

like image 903
Golem Avatar asked Jul 18 '12 13:07

Golem


1 Answers

Here is a fairly good explanation.

A closure is created when you reference a variable in the body of a method from a delegate. Essentially, a class that contains a reference to the local variable is generated.
If the variable is constantly modified, when an external method calls the delegate, it may contain an unpredictable value, or even throw an exception. For example, in an example like this:

foreach (string data in _dataList)
{
    DoStuff (() => data);
}

The method () => data is always going to be the same method. if you store it, you don't know what happens when it's eventually invoked -- what will the value of data be at the time? Will it even be valid? This is especially dangerous if you use yield return.

A simpler example, without an iterator, is:

var x = 5;
Action f = () => Console.WriteLine(x);
x = 76;
f();
like image 78
GregRos Avatar answered Sep 22 '22 23:09

GregRos