Ich habe einige C# -Code, der wie dieserSoftware Transaktionen in C#
D d = new D();
foreach(C item in list)
{
c.value++;
d.Add(c); // c.value must be incremented at this point
}
if(!d.Process())
foreach(C item in list)
c.value--;
Es Wert in einer Liste für jedes Element erhöht arbeiten muss und dann versucht, auf sie einige Verarbeitung zu tun. Wenn die Verarbeitung fehlschlägt, muss die Mutation oder die Elemente verdunkelt werden.
Die Frage ist: gibt es eine bessere Möglichkeit, dies zu tun? Die Dinge, die ich nicht mag ist, dass es Möglichkeiten gibt, wie ich sehen kann, dass es schief geht. Zum Beispiel, wenn etwas über alles wirft es nicht mehr synchron ist.
Eine Idee (das scheint fast noch schlimmer als das Problem) ist:
D d = new D();
var done = new List<C>();
try
{
foreach(C item in list)
{
c.value++;
done.Add(c);
d.Add(c);
}
if(d.Process()) done.Clear();
}
finaly
{
foreach(C c in done)
c.value--;
}
Ich arbeite mit Referenz-Semantik, so dass es nicht funktioniert, wenn ich eine tiefe Kopie mache und selbst dann es funktioniert möglicherweise nicht, wenn es andere Verweise auf die Elemente gibt. – BCS