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

C# Discussion :

MVC Helper SuppressFinalize


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 59
    Par défaut MVC Helper SuppressFinalize
    Bonjour,

    J'aimerai savoir pourquoi il faut appeler le GC.SuppressFinalize(this).

    Tout les codes que je trouve l'utilise mais impossible pour moi de trouver pourquoi...

    Une petit aide serai simpa

    Bonne journée

    Code du helper MVC
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    namespace MvcPanelExample.Models.Html
    {
        using System;
        using System.Diagnostics.CodeAnalysis;
        using System.Web;
     
        public class MvcPanel : IDisposable
        {
            #region Fields
     
            private bool disposed;
            private readonly HttpResponseBase httpResponse;
     
            #endregion
     
            #region CTOR
     
            public MvcPanel(HttpResponseBase httpResponse)
            {
                if (httpResponse == null)
                {
                    throw new ArgumentNullException("httpResponse");
                }
                this.httpResponse = httpResponse;
            }
     
            #endregion
     
            #region Methods
     
            public void Dispose()
            {
                Dispose(true /* disposing */);
                GC.SuppressFinalize(this); /* <===== Here */
            }
     
            protected virtual void Dispose(bool disposing)
            {
                if (!this.disposed)
                {
                    this.disposed = true;
                    this.httpResponse.Write("</div>");
                }
            }
     
            public void EndPanel()
            {
                Dispose(true);
            }
     
            #endregion
        }
    }

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Effectivement, dans le pattern "Dispose" standard, on appelle généralement SuppressFinalize dans le Dispose pour empêcher le finaliseur d'être exécuté à nouveau. Mais dans ton cas, ça ne sert à rien puisque tu ne définis pas de finaliseur...

    En fait, quand on implémente IDisposable, on définit souvent un finaliseur (aussi appelé "destructeur") pour appeler Dispose avant que l'objet soit ramassé par le garbage collector (cf. cet article sur MSDN). Ca permet de s'assurer que l'objet sera disposé à un moment donné, même si Dispose n'a pas été appelé explicitement. Dans ton cas, ça donnerait quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ~MvcPanel()
    {
        Dispose(false);
    }
    Puisque le finaliseur ne fait rien d'autre qu'appeler Dispose, ça ne sert à rien de l'exécuter si l'objet a déjà été disposé, donc on indique au GC ne ne pas appeler le finaliseur sur cet objet.

    En l'occurrence, je ne pense pas que tu aies besoin de définir un finaliseur ; en effet, si c'est le GC qui déclenche le Dispose, ce sera beaucoup trop tard pour écrire dans la HttpResponse, qui aura sans doute été fermée depuis longtemps...

    Donc tu peux virer le GC.SuppressFinalize, puisque tu n'as pas de finaliseur.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 59
    Par défaut
    Merci beaucoup pour cette réponse

    bonne journée

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

Discussions similaires

  1. MVC, helpers, probleme d'acces du code behind
    Par Invité dans le forum ASP.NET
    Réponses: 1
    Dernier message: 03/02/2010, 15h02
  2. Helpers dans une application MVC
    Par Neuromancien2 dans le forum Langage
    Réponses: 3
    Dernier message: 10/07/2009, 14h26
  3. Réponses: 4
    Dernier message: 24/02/2009, 12h06
  4. [MVC] Différences entre les framework MVC push et pull ?
    Par XavierZERO dans le forum Frameworks Web
    Réponses: 5
    Dernier message: 15/01/2004, 13h12
  5. Classe abstraite / MVC
    Par caramel dans le forum MVC
    Réponses: 5
    Dernier message: 01/04/2003, 09h27

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