Bonsoir à tous,

derrière ce titre occulte se cache en fait une question très simple.

Imaginons le code suivant:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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.