Tôi đã giúp một đồng nghiệp gỡ lỗi một số hành vi lạ trong mã của họ. Mẫu sau đây minh họa điều này:Tại sao khối cuối cùng của tôi không hoạt động trong C#?
static void Main(string[] args)
{
string answer = Sample();
Console.WriteLine(answer);
}
public static string Sample()
{
string returnValue = "abc";
try
{
return returnValue;
}
catch (Exception)
{
throw;
}
finally
{
returnValue = "def";
}
}
Mẫu này trở lại là gì?
Bạn sẽ nghĩ rằng vì khối cuối cùng, nó trả về "def" nhưng trên thực tế, nó trả về "abc"? Tôi đã bước qua mã và xác nhận rằng khối cuối cùng là trong thực tế gọi.
Câu trả lời thực sự là bạn không nên viết mã như thế này ngay từ đầu nhưng tôi vẫn bối rối về hành vi.
Chỉnh sửa: Để làm rõ luồng dựa trên một số câu trả lời.
Khi bạn duyệt qua mã, cuối cùng được thực hiện trước khi trả lại.
Duplicate của:What really happens in a try { return x; } finally { x = null; } statement?
điều này là sai..Nếu câu lệnh trả về nằm trong khối thử, khối cuối cùng, nếu có, sẽ được thực hiện trước khi điều khiển trả về phương thức gọi. – TStamper
TStamper - giá trị trả về được đánh giá trong thử trong khi biến vẫn là "abc", sau đó cuối cùng thực hiện và thay đổi việc gán biến nhưng KHÔNG phải cái đã được lưu trữ để được trả về. – Chuck
đúng, nhưng từ ngữ sai. Từ những gì anh ta nói mã không tiếp tục chạy trong hàm mẫu – TStamper