2021-04-28 16:49:39 +02:00
|
|
|
Once you modify a closure, any use of it could provide unexpected results.
|
|
|
|
|
2021-04-28 18:08:03 +02:00
|
|
|
|
2021-04-28 16:49:39 +02:00
|
|
|
== Noncompliant Code Example
|
|
|
|
|
|
|
|
----
|
|
|
|
var x = 0;
|
|
|
|
Func<int> f1 = () => x; // Noncompliant
|
|
|
|
x = 1;
|
|
|
|
Console.WriteLine(f1());
|
|
|
|
|
|
|
|
var input = new[] { 1, 2, 3 };
|
|
|
|
var fs = new List<Func<int>>();
|
|
|
|
for (var i = 0; i < input.Length; i++) {
|
|
|
|
Func<int> f = () => input[i]; // Noncompliant
|
|
|
|
fs.Add(f);
|
|
|
|
}
|
|
|
|
Console.WriteLine(fs[0]()); //Access to modified closure yields Exception
|
|
|
|
----
|
|
|
|
|
2021-04-28 18:08:03 +02:00
|
|
|
|
2021-04-28 16:49:39 +02:00
|
|
|
== Compliant Solution
|
|
|
|
|
|
|
|
----
|
|
|
|
var x = 0;
|
|
|
|
var xx = x;
|
|
|
|
Func<int> f = () => xx;
|
|
|
|
x = 1;
|
|
|
|
Console.WriteLine(f());
|
|
|
|
|
|
|
|
var input = new[] { 1, 2, 3 };
|
|
|
|
var fs = new List<Func<int>>();
|
|
|
|
for (var i = 0; i < input.Length; i++) {
|
|
|
|
var ii = i;
|
|
|
|
Func<int> f = () => input[ii];
|
|
|
|
fs.Add(f);
|
|
|
|
}
|
|
|
|
Console.WriteLine(fs[0]());
|
|
|
|
|
|
|
|
----
|
|
|
|
or
|
|
|
|
|
|
|
|
----
|
|
|
|
var input = new[] { 1, 2, 3 };
|
|
|
|
var fs = input.Select(t => (Func<int>) (() => t)).ToList();
|
|
|
|
Console.WriteLine(fs[0]());
|
|
|
|
----
|
2021-04-28 18:08:03 +02:00
|
|
|
|
2021-06-02 20:44:38 +02:00
|
|
|
|
2021-06-03 09:05:38 +02:00
|
|
|
ifdef::env-github,rspecator-view[]
|
2021-06-02 20:44:38 +02:00
|
|
|
== Comments And Links
|
|
|
|
(visible only on this page)
|
|
|
|
|
|
|
|
include::comments-and-links.adoc[]
|
2021-06-03 09:05:38 +02:00
|
|
|
endif::env-github,rspecator-view[]
|