Temel olarak, kod hiç bu kadar kolay olmamıştı. Tek çıkış noktası güzel bir idealdir, ancak kodu sadece elde etmek için şekilden bükmezdim ... Ve alternatif yerel bir değişken (kilit dışında) bildiriyorsa, (kilidin içinde) ve sonra geri (kilit dışında), sonra kilit içinde basit bir "dönüş foo" çok daha basit olduğunu söyleyebilirim.
IL'deki farkı göstermek için, şu kodu girelim:
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;
}
}
(mutlu bir şekilde ReturnInside
C # daha basit / temiz bir bit olduğunu iddia ediyorum unutmayın )
Ve IL'ye bakın (serbest bırakma modu vb.):
.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
}
Yani IL seviyesinde [bazı isimler verin veya alın] aynıdır (bir şey öğrendim ;-p). Bu nedenle, tek mantıklı karşılaştırma, yerel kodlama stilinin (oldukça öznel) yasasıdır ... ReturnInside
Basitliği tercih ederim , ama ikisinden de heyecanlanmam.