我已經看到了這個例子:爲什麼在C#6.0中交換內部'finally'和'outer'的執行順序?
static void Main(string[] args)
{
Console.WriteLine("Start");
try
{
SomeOperation();
}
catch (Exception) when (EvaluatesTo())
{
Console.WriteLine("Catch");
}
finally
{
Console.WriteLine("Outer Finally");
}
}
private static bool EvaluatesTo()
{
Console.WriteLine($"EvaluatesTo: {Flag}");
return true;
}
private static void SomeOperation()
{
try
{
Flag = true;
throw new Exception("Boom");
}
finally
{
Flag = false;
Console.WriteLine("Inner Finally");
}
}
將會產生下一個輸出:
Start
EvaluatesTo: True
Inner Finally
Catch
Outer Finally
這聽起來怪我,我期待這個順序來包裝它的一個很好的解釋在我的腦海中。我期待when
前要執行的finally
塊:
Start
Inner Finally
EvaluatesTo: True
Catch
Outer Finally
的文檔指出這個執行順序是正確的,但它並沒有在它爲什麼這樣做了闡述和究竟是執行規則在此點餐。
@RahulTripathi不,我的問題是關於在C#6.0中交換執行順序,這個問題在6.0之前有一個在香草C#中的直接執行順序 – Archeg
這是一個不可避免的結果,當*子句起作用時。 CLR無法確定最終需要執行的內容,直到*找出catch子句將處理異常之後。只有這樣它才能開始展開堆棧,最終執行塊。 when表達式的可能的無意的副作用是爲什麼在v6之前它被排除在C#語言之外。 –
@HansPassant具體而言,這是如此:「CLR無法弄清楚最終需要執行的內容,直到它找出catch子句將處理異常爲止。」? –