從本質上講,它使代碼更簡單。單點退出是一個不錯的理想,但我不會將代碼變形以實現它。如果替代方法是聲明局部變量(在鎖之外),初始化它(在鎖之內)和然後返回它(在鎖之外),然後我會說鎖內的一個簡單的「返回foo」要簡單得多。
要顯示IL的差異,讓代碼:
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;
}
}
(注意,我會高興地認爲,ReturnInside
是C#的一個簡單/清潔位)
,並在IL看(釋放模式等):
.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
}
所以在IL水平,他們是[給予或採取一些名字]相同的(我學到了一些東西;-p)。 因此,唯一合理的比較是局部編碼風格的(高度主觀的)規律......爲了簡單起見,我更喜歡ReturnInside
,但我不會爲任何一方感到興奮。
如何射擊反射器,並做一些比較IL ;-)。 – 2008-11-05 21:14:20
@Pop:done - 在IL語言中都不是更好 - 僅適用於C#風格 – 2008-11-05 21:32:01
非常有趣,哇,今天我學到了一些東西! – Pokus 2008-11-05 21:35:26