เป็นหลักซึ่งเคยทำให้รหัสง่ายขึ้น จุดทางออกเดียวเป็นอุดมคติที่ดี แต่ฉันจะไม่งอรหัสออกจากรูปร่างเพียงเพื่อให้บรรลุ ... และหากทางเลือกคือการประกาศตัวแปรท้องถิ่น (นอกล็อค) เริ่มต้นมัน (ภายในล็อค) และ จากนั้นส่งคืน (นอกล็อค) จากนั้นฉันจะบอกว่า "return 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
ความเรียบง่าย แต่ฉันก็ไม่ได้รู้สึกตื่นเต้นเหมือนกัน