The finally statement is executed, but the return value isn't affected. The execution order is:
- Code before return statement is executed
- Expression in return statement is evaluated
- finally block is executed
- Result evaluated in step 2 is returned
Here's a short program to demonstrate:
using System;
class Test
{
static string x;
static void Main()
{
Console.WriteLine(Method());
Console.WriteLine(x);
}
static string Method()
{
try
{
x = "try";
return x;
}
finally
{
x = "finally";
}
}
}
This prints "try" (because that's what's returned) and then "finally" because that's the new value of x.
Of course, if we're returning a reference to a mutable object (e.g. a StringBuilder) then any changes made to the object in the finally block will be visible on return - this hasn't affected the return value itself (which is just a reference).
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…