IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Utilisation finaliseurs / using pour libérer un controle


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 78
    Par défaut 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 : 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.

  2. #2
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Bah tout simplement,

    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
     
    bool returnValue;
     
    if (...)
    {
        // Code
        returnValue = true;
    }
    else if (...)
    {
        // Code
        returnValue = true;
    }
    else
    {
        // Code
        returnValue = false;
    }
     
    EndUpdate();
    return returnValue;
    Tu as aussi le try/finally
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  3. #3
    Membre émérite
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Par défaut
    Moi je dirais le 2e...

  4. #4
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Je préfère moi aussi le try-finally... pourquoi ?
    - dans le code 1, tu n'est pas sure que EndUpdate soit appelé si une exception est levée par do something
    - dans le 2, EndUpdate est toujours appelé, quelque soit l'exécution de do something
    - dans le 3 ... pourquoi prendre un bazooka pour tuer une fourmi ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 78
    Par défaut
    Merci pour vos réponses.

    Après avoir fait mon post, j'ai continué à fouiller, et je suis tombé sur un article qui expliquait que implicitement les codes avec du "using" etaient automatiquement transformés en try / finally avec un appel au DoDispose dans le finally.

    Etant donné que j'aime pas trop la méthode de tout écrire à la main, je pense que je vais me tourner vers le try / finally qui a le mérite d'etre Exception-Safe.

    Merci à vous !

    Bonne journée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Quel controle utiliser sur feuille pour visualiser deux colonnes
    Par chris09300 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 31/03/2011, 23h59
  2. Réponses: 2
    Dernier message: 20/08/2008, 16h45
  3. utilisation du mid pour tester le début d'un champ
    Par PrinceMaster77 dans le forum ASP
    Réponses: 4
    Dernier message: 09/07/2004, 14h10
  4. Réponses: 36
    Dernier message: 13/05/2004, 19h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo