Да, блок finally запускается после возврата из функции, но это не имеет значения. Помните, что возвращаемое значение передается по значению, поэтому для него создается временная переменная во время возврата, поэтому блок finally не влияет на фактическое возвращаемое значение. Если вы хотите поддерживать желаемое поведение, вы можете использовать параметр out, например:
static void Main(string[] args)
{
string answer;
Sample(out answer);
Console.WriteLine(answer);
}
public static void Sample(out string answer)
{
try
{
answer = "abc";
return;
}
catch (Exception)
{
throw;
}
finally
{
answer = "def";
}
}
Или вы можете просто переместить оператор return за пределы блока try, например:
static void Main(string[] args)
{
string answer = Sample();
Console.WriteLine(answer);
}
public static string Sample()
{
string returnValue;
try
{
returnValue = "abc";
}
catch (Exception)
{
throw;
}
finally
{
returnValue = "def";
}
return returnValue;
}
Однако, учитывая, что блок finally всегда будет переопределять возвращаемое значение, это сомнительный дизайн.