Utilisation finaliseurs / using pour libérer un controle
Bonsoir à tous,
derrière ce titre occulte se cache en fait une question très simple.
Imaginons le code suivant:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
void BeginUpdate()
{
if (count == 0)
my_ctrl.Enabled = false;
count++;
}
void EndUpdate()
{
count--;
if (count == 0)
my_ctrl.Enabled = true;
} |
Utilisé dans le cas suivant:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
void Toto()
{
BeginUpdate();
if (condition)
{
// do something
EndUpdate();
return true;
}
else
{
// do something else
EndUpdate();
return true;
}
else
{
EndUpdate();
return false;
}
} |
Pour éviter cette écriture disgracieuse j'ai pensé aux deux méthodes suivantes:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| void Toto()
{
try
{
BeginUpdate();
if (condition)
{
// do something
return true;
}
else
{
// do something else
return true;
}
else
{
return false;
}
}
finally
{
EndUpdate();
}
} |
Et une autre méthode un peu plus 'hack' avec une classe encapsulant une delegate et l'executant dans le DoDispose:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| void Toto()
{
BeginUpdate();
using (ScopeFinalizer finalizer = new ScopeFinalizer(delegate() { EndUpdate(); })
{
if (condition)
{
// do something
return true;
}
else
{
// do something else
return true;
}
else
{
return false;
}
}
} |
Quelqu'un connait-il un autre manière plus 'propre' de faire? Ou sinon, laquelle de ces trois methodes est la plus propre?
Merci d'avance pour vos suggestion!
Bonne soirée.