Intinya, mana yang pernah membuat kode lebih sederhana. Satu titik keluar adalah ideal yang bagus, tapi saya tidak akan membengkokkan kode keluar dari bentuk hanya untuk mencapainya ... Dan jika alternatifnya mendeklarasikan variabel lokal (di luar kunci), menginisialisasi (di dalam kunci) dan lalu mengembalikannya (di luar kunci), maka saya akan mengatakan bahwa "pengembalian foo" sederhana di dalam kunci jauh lebih sederhana.
Untuk menunjukkan perbedaan dalam IL, mari kode:
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;
}
}
(perhatikan bahwa saya akan dengan senang hati berpendapat bahwa itu ReturnInside
adalah sedikit lebih mudah / bersih dari C #)
Dan lihat IL (mode rilis dll):
.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
}
Jadi pada level IL, mereka [memberi atau menerima beberapa nama] identik (saya belajar sesuatu ;-p). Dengan demikian, satu-satunya perbandingan yang masuk akal adalah hukum (sangat subyektif) gaya pengkodean lokal ... Saya lebih suka ReturnInside
untuk kesederhanaan, tapi saya tidak akan senang dengan baik.