ラベルはループを識別します。 C#は実際にはループラベルを持っていないため、あなたの混乱を理解できますが、.NETは内部でそれらを使用しているため、.NETの表現ツリーで使用されます。 Javaコードの例(ループラベルがあります)があります。
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;
}
}
Expression.Loop
メソッドは、「このラベルはこのループを指します」と書かれた引数としてラベルを取得します。あなたが持っているとき Expression.Break(label, result)
, 、「このラベルが言及するループから抜け出す」と書かれています。この場合、ブロックの単一ループです。
ローカル変数の場合、 Expression.Block
の最初の議論は、そのブロックにスコープされたすべてのローカル変数を宣言します。そう result
最初に宣言され、次に初期化されます Expression.Assign
電話。
結果の表現ツリーは、このC#コードとほぼ同等です。
{ // 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)
} // )