Im Wesentlichen, was auch immer den Code einfacher macht. Single Point of Exit ist ein schönes Ideal, aber ich würde den Code nicht aus der Form bringen, um ihn zu erreichen ... Und wenn die Alternative darin besteht, eine lokale Variable (außerhalb des Schlosses) zu deklarieren, sie zu initialisieren (innerhalb des Schlosses) und Wenn Sie es dann zurückgeben (außerhalb des Schlosses), würde ich sagen, dass ein einfaches "Return Foo" innerhalb des Schlosses viel einfacher ist.
Um den Unterschied in IL zu zeigen, lassen Sie uns Folgendes codieren:
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;
}
}
(Beachten Sie, dass ich gerne behaupten würde, dass dies ReturnInside
ein einfacheres / saubereres Stück C # ist.)
Und schauen Sie sich die IL an (Release-Modus usw.):
.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
}
Auf IL-Ebene sind sie also identisch (ich habe etwas gelernt ;-p). Als solches ist der einzig sinnvolle Vergleich das (höchst subjektive) Gesetz des lokalen Codierungsstils ... Ich bevorzuge der ReturnInside
Einfachheit halber, aber ich würde mich auch nicht darüber aufregen.