Về cơ bản, điều này bao giờ làm cho mã đơn giản hơn. Một điểm thoát duy nhất là một lý tưởng tốt đẹp, nhưng tôi sẽ không bẻ cong mã ra khỏi hình dạng chỉ để đạt được nó ... Và nếu phương án thay thế là khai báo một biến cục bộ (bên ngoài khóa), hãy khởi tạo nó (bên trong khóa) và sau đó trả lại (bên ngoài khóa), sau đó tôi sẽ nói rằng một "return foo" đơn giản bên trong khóa đơn giản hơn rất nhiều.
Để hiển thị sự khác biệt trong IL, hãy cho phép mã:
static class Program
{
static void Main() { }
static readonly object sync = new object();
static int GetValue() { return 5; }
static int ReturnInside()
{
lock (sync)
{
return GetValue();
}
}
static int ReturnOutside()
{
int val;
lock (sync)
{
val = GetValue();
}
return val;
}
}
(lưu ý rằng tôi vui vẻ tranh luận rằng đó ReturnInside
là một bit đơn giản / gọn gàng hơn của C #)
Và nhìn vào IL (chế độ phát hành, v.v.):
.method private hidebysig static int32 ReturnInside() cil managed
{
.maxstack 2
.locals init (
[0] int32 CS$1$0000,
[1] object CS$2$0001)
L_0000: ldsfld object Program::sync
L_0005: dup
L_0006: stloc.1
L_0007: call void [mscorlib]System.Threading.Monitor::Enter(object)
L_000c: call int32 Program::GetValue()
L_0011: stloc.0
L_0012: leave.s L_001b
L_0014: ldloc.1
L_0015: call void [mscorlib]System.Threading.Monitor::Exit(object)
L_001a: endfinally
L_001b: ldloc.0
L_001c: ret
.try L_000c to L_0014 finally handler L_0014 to L_001b
}
method private hidebysig static int32 ReturnOutside() cil managed
{
.maxstack 2
.locals init (
[0] int32 val,
[1] object CS$2$0000)
L_0000: ldsfld object Program::sync
L_0005: dup
L_0006: stloc.1
L_0007: call void [mscorlib]System.Threading.Monitor::Enter(object)
L_000c: call int32 Program::GetValue()
L_0011: stloc.0
L_0012: leave.s L_001b
L_0014: ldloc.1
L_0015: call void [mscorlib]System.Threading.Monitor::Exit(object)
L_001a: endfinally
L_001b: ldloc.0
L_001c: ret
.try L_000c to L_0014 finally handler L_0014 to L_001b
}
Vì vậy, ở cấp độ IL, chúng giống nhau [cho hoặc lấy một số tên] (tôi đã học được điều gì đó ;-p). Như vậy, so sánh hợp lý duy nhất là luật (rất chủ quan) của phong cách mã hóa địa phương ... Tôi thích ReturnInside
sự đơn giản, nhưng tôi cũng không hào hứng với điều đó.