Ein Etikett identifiziert eine Schleife. Ich kann Ihre Verwirrung verstehen, da C# eigentlich keine Schleifenbezeichnungen enthält, aber .NET sie intern verwendet und sie werden daher in .NETs Ausdrucksbäumen verwendet. Hier ist ein Beispiel für Java -Code (der Schleifenbezeichnungen enthält):
outerLoop: // This is a label for the outer loop
while (true) {
innerLoop: // This is a label for the inner loop
while (true) {
// Rather than exiting the inner loop (which is what a plain break would
// do), this exits the outer loop
break outerLoop;
}
}
Das Expression.Loop
Die Methode nimmt ein Etikett als Argument an, das besagt, dass "dieses Etikett sich auf diese Schleife bezieht". Wenn du. .. hast Expression.Break(label, result)
, Es heißt "Brechen Sie aus der Schleife aus, auf die sich dieses Etikett bezieht", was in diesem Fall die einzelnen Schleife des Blocks ist.
Für die lokale Variable, Expression.Block
Das erste Argument erklärt alle lokalen Variablen, die zu diesem Block geschrieben sind. So result
wird zuerst deklariert und dann von der initialisiert Expression.Assign
Anruf.
Der resultierende Ausdrucksbaum entspricht ungefähr diesem C# -Code:
{ // Expression.Block(
int result; // new[] { result },
result = 1; // Expression.Assign(result, Expression.Constant(1)),
while (true) // Expression.Loop(
{
if (value > 1) // Expression.IfThenElse(
{ // Expression.GreaterThan(value, Expression.Constant(1)),
result *= // Expression.MultiplyAssign(result,
value--; // Expression.PostDecrementAssign(value)),
}
else
{
break; // Expression.Break(label, result)
} // ),
} // label)
} // )