Yes, the finally
block is executed however the flow leaves the try
block - whether by reaching the end, returning, or throwing an exception.
From the C# 4 spec, section 8.10:
The statements of a finally block are always executed when control leaves a try
statement. This is true whether the control transfer occurs as a result of normal
execution, as a result of executing a break, continue, goto, or return statement, or as a
result of propagating an exception out of the try statement.
(Section 8.10 has a lot more detail on this, of course.)
Note that the return value is determined before the finally block is executed though, so if you did this:
int Test()
{
int result = 4;
try
{
return result;
}
finally
{
// Attempt to subvert the result
result = 1;
}
}
... the value 4 will still be returned, not 1 - the assignment in the finally
block will have no effect.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…