Essentiellement, ce qui rend le code plus simple. Un seul point de sortie est un bel idéal, mais je ne plierais pas le code pour le réaliser ... Et si l'alternative est de déclarer une variable locale (en dehors du verrou), l'initialiser (à l'intérieur du verrou) et puis je le retourne (en dehors de la serrure), alors je dirais qu'un simple "retour foo" à l'intérieur de la serrure est beaucoup plus simple.
Pour montrer la différence de IL, permet de code:
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;
}
}
(notez que je dirais heureusement que ReturnInside
est un simple/peu plus propre de C#)
Et regarde l'IL (mode de sortie, etc.):
.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
}
donc, au niveau iL ils sont [donner ou prendre des noms identiques] (j'appris quelque chose ;-P). En tant que tel, la seule comparaison raisonnable est la loi (hautement subjective) du style de codage local ... Je préfère ReturnInside
pour la simplicité, mais je ne serais pas excité à propos non plus.
Que diriez-vous de tir réflecteur et faire une comparaison IL ;-). –
@Pop: fait - aucun n'est meilleur en IL - seul le style C# s'applique –
Très intéressant, wow j'apprends quelque chose aujourd'hui! – Pokus