c# - Meilleure pratique pour ajouter des contrôles à l'exécution



.net vb.net (5)

Lorsque vous ajoutez des contrôles à un formulaire lors de l'exécution, vous pouvez effectuer l'une des opérations suivantes:

Button btn = new Button();
//...
this.Controls.Add(btn);

ou

Button x = new Button();
//...
btn.Parent = this;

J'avais supposé que c'était la même chose, et c'était juste à la préférence personnelle de le faire, mais quelqu'un au travail a mentionné que la seconde méthode est pire car le bouton ne sera pas éliminé quand le formulaire est éliminé (en supposant qu'aucun événement les gestionnaires ont été ajoutés et sont maintenus).

Cela n'avait pas beaucoup de sens pour moi, alors j'ai regardé en ligne, mais je n'ai rien trouvé à dire d'une façon ou d'une autre.

Est-ce que quelqu'un connaît la réponse ou peut me diriger dans la bonne direction?


C'est vraiment une question de goût. Voici ce qui se passe lorsque vous définissez la propriété Parent sur un Control . Ce code est courtoisie de .NET Reflector.

set
{
    if (this.parent != value)
    {
        if (value != null)
        {
            value.Controls.Add(this);
        }
        else
        {
            this.parent.Controls.Remove(this);
        }
    }
}

Dans le second cas, le contrôle peut ne pas être éliminé quand le formulaire le fait (je ne sais pas si c'est le cas ou pas), mais il devrait quand même être libéré par le prochain cycle de garbage collection, puisqu'il ne devrait pas y avoir de références à celui-ci après la mise au rebut du formulaire. Le résultat est, si le bouton est disposé avec le formulaire est un non-problème pour la plupart des applications. Dans la grande majorité des applications qui utilisent des formulaires, l'utilisateur est le goulot d'étranglement, donc si vous devez attendre un ou deux passages du garbage collector avant de disposer d'une collection de contrôles de formulaire, cela n'a aucune incidence sur votre décision de conception.

Cela étant dit, je préfère

this.Controls.Add(btn);

parce que cela semble être plus approprié sur le plan sémantique pour ce que vous faites réellement. J'utilise toujours cette méthode plutôt que de définir la propriété Control.Parent .


Je peux voir où l'élimination de bouton pourrait être un problème si vous écrivez une application qui ouvre et ferme beaucoup de formes pendant sa durée. Vous devez vous assurer que vous disposez d'un code de mise au rebut approprié pour vous assurer que l'application n'aspire pas trop de mémoire.

Cela mis à part, j'aime la première déclaration parce qu'elle explique plus clairement ce que fait votre code. Vous créez un nouveau bouton et vous l'ajoutez aux contrôles existants sur la page. Vous pouvez lire ceci juste après le débogage / refactoring et comprendre ce qui se passe. Dans le second groupe de code, c'est un peu plus vague. Si vous avez balayé la déclaration du bouton initial et vu le btn.Parent = cette déclaration, vous pourriez être amené à croire que vous étiez en train de réaffecter le bouton à un nouveau formulaire, ou quelque chose à cet effet.

Cela a l'air un peu nerveux, mais dernièrement j'ai aidé quelques collègues en leur montrant une partie de mon code et je viens de trouver que bien qu'il y ait certainement plus d'une façon de peler un chat, il y a parfois un certain manière de l'écorcher qui s'explique beaucoup mieux en regardant les choses dans le futur.


Personnellement, j'aime

Button btn = new Button();
//...
this.Controls.Add(btn);

Parce que c'est un code plus explicite et plus lisible.


J'ai toujours préféré identifier les contrôles de l'objet que je vais ajouter le nouveau contrôle à ...

Button btn = new Button();
this.PlaceHolder1.Controls.Add(btn);

Button btn2 = new Button();
this.PlaceHolder2.Controls.Add(btn2);

Je pense que c'est plus facile à lire et que vous n'avez pas à faire d'analyse d'arbre généalogique pour savoir qui est le parent ...

Je crois que l'utilisation du code .Parent en interne fait le .Controls.Add, donc ils devraient avoir le même résultat final, mais pour moi, il revient à la lisibilité du code.

Il y a une question similaire ici sur .





controls