Hallo Community,
Ich bin gerade dabei ein übernommenes Project zu Refactoren, dabei kommt mir des öfteren die R# Warnung: "Implicite Captured Closure: ...." unter,
Nun ist mir klar was das bedeutet, jedoch bin ich mir nicht sicher ob das ganze so gewollt ist. Unabhängig davon ob es gewollt ist oder nicht, wollte ich fragen ob es Probleme geben kann wenn man das Compiler verhalten ausnutzt um die gleichen Variablen zwischen verschiedenen Lambda Expressions zu verwenden, oder ob man auf klassen variablen umsteigen soll, wenn die man mit den selben variablen arbeiten will?
mfg Console
Es gibt mMn. nur dann Probleme wenn die Lambda Expression nicht sofort in dem Block ausgeführt wird sondern erst später:
Hier zB schreit ReSharper obwohl es keine Probleme geben wird:
for (int i = 0; i < 10; i++)
{
Action action = () => Console.WriteLine(i);
action();
}
Ausgabe:
0
1
2
3
4
5
6
7
8
9
Hier allerdings wird die Ausgabe nicht das gewünschte Ergebnis erzielen.
List<Action> actions = new List<Action>();
for (int i = 0; i < 10; i++)
{
Action action = () => Console.WriteLine(i);
actions.Add(action);
}
foreach (Action action in actions)
action();
Ausgabe:
10
10
10
10
10
10
10
10
10
10
Lg, XXX
//Edit: Bevor Herbivore seine Antwort abschickt revidier ich mal meine Aussage: Bei meinem Beispiel gehts um die "Access to modified closure" Meldung. 😛
Hallo Console32,
Nun ist mir klar was das bedeutet
da hast du mir was voraus. Ich weiß zwar, was captures bzw. closures sind, aber nicht, was der Unterschied zwischen explizit und implizit capturen ist. Kannst du das erklären?
um die gleichen Variablen zwischen verschiedenen Lambda Expressions zu verwenden
Kannst du mal ein Beispiel geben, wo sowas in dem Code vorkommt?
Hallo xxxprod,
wenn man innerhalb der Schleife eine Variable j deklariert, an die man i zuweist und die man innerhalb des Schleifenrumpfs statt i verwendet, dann klappt es auch in deinem zweiten Beispiel wie gewünscht.
herbivore
Hallo herbivore,
den unterscheid zwischen implicit und explicit kenne ich nicht. auch findet man zu den begriffen explicit captured closure / implicit captured closure nicht viel (nur bei implicit ein paar threads zu der R# warnung)
Ich muss gestehen, ich habe die Warnung von R# auch missverstanden, diese hat nämlich nichts mit dem gemeinsamen verwenden von variablen über mehrere Lambda Expressions zu tun(was ja durchaus gewollt sein kann), sondern mit dem ungewollten am leben halten von Großen Objekte / Potenziellen Memory Leaks.
Somit hat sich meine frage auch erübrigt ob es in Ordnung ist variablen über mehrere Lambdas gemeinsam zu verwenden. Ich stand wohl irgendwie auf dem schlauch.