Giả sử rằng bạn có phương thức C# với câu lệnh return
bên trong khối try
. Có thể sửa đổi giá trị trả lại trong khối finally
không?Có thể thay đổi giá trị trả về trong một mệnh đề cuối cùng trong C# không?
Cách tiếp cận rõ ràng, sử dụng return
trong khối finally
, sẽ không làm việc:
String Foo()
{
try
{
return "A";
}
finally
{
// Does not compile: "Control cannot leave the body of a finally clause"
return "B";
}
}
Điều thú vị là, này có thể được thực hiện trong VB: Return
bên Finally
bị cấm, nhưng chúng ta có thể lạm dụng thực tế là (có lẽ vì lý do tương thích ngược) VB vẫn cho phép giá trị trả về được sửa đổi bằng cách gán nó cho tên phương thức:
Function Foo() As String ' Returns "B", really!
Try
Return "A"
Finally
Foo = "B"
End Try
End Function
Ghi chú:
Lưu ý rằng tôi hỏi câu hỏi này thuần túy vì tò mò khoa học; Rõ ràng, mã như vậy là rất dễ bị lỗi và khó hiểu và không bao giờ nên được viết.
Lưu ý rằng tôi là không phải hỏi về
try { var x = "A"; return x; } finally { x = "B"; }
. Tôi biết rằng điều này không thay đổi giá trị trả về và I understand why this happens. Tôi muốn biết nếu có là các cách để thay đổi giá trị trả lại được đặt bên trong khối thử bằng phương tiện của một khối cuối cùng.
Ngừng lạm dụng VB.NET - đã bị lạm dụng đủ rồi! – Oded
Chỉ vì bạn * có thể * làm điều này trong VB không có nghĩa là bạn * nên *! –
Ngừng sử dụng VB.NET - nó đã sử dụng đủ rồi! – PhonicUK