Laden...

Captured Closure -> Ist es in Ordnung wenn lambdas die selben variablen verwenden sollen?

Erstellt von Console32 vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.245 Views
C
Console32 Themenstarter:in
258 Beiträge seit 2011
vor 11 Jahren
Captured Closure -> Ist es in Ordnung wenn lambdas die selben variablen verwenden sollen?

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

1.378 Beiträge seit 2006
vor 11 Jahren

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. 😛

49.485 Beiträge seit 2005
vor 11 Jahren

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

C
Console32 Themenstarter:in
258 Beiträge seit 2011
vor 11 Jahren

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.