c# parse - Pourquoi utiliser TagBuilder au lieu de StringBuilder?




how to (6)

ne génèrent-ils pas la même chose ??

Bien, bien sûr, mais cela ne devrait pas être dissuasif, non? Une classe est conçue pour quelque chose de plus spécifique que l’autre, elle offre donc un plus grand confort.

Je pourrais demander: pourquoi utiliser un StringBuilder ? Pourquoi pas une List<char> ? Est-ce que je ne pourrais pas générer la même chose de l'un ou l'autre?

Pour aller encore plus loin: pourquoi même un List<char> ? Pourquoi ne pas simplement un caractère char[] , le redimensionnement / manipulation que je peux me contrôler? Je peux encore totalement créer une string partir d'un caractère char[] .

En fait, tout ce dont j'ai besoin, c'est d'un char* et d'un int (pour la longueur). Droite?

Mon idée est simplement que si une classe est disponible pour des fonctionnalités spécialisées que vous pouvez utiliser, il est logique de l’utiliser si vous me le demandez.

Quelle est la différence entre l'utilisation du générateur de balises et du générateur de chaînes pour créer une table dans une classe htmlhelper ou l'utilisation de HtmlTable?

ne génèrent-ils pas la même chose ??


Il y a un point que les autres réponses ont manqué jusqu'à présent. Si vous renvoyez TagBuilder partir d'une méthode d'extension, vous pouvez continuer à ajouter des attributs dans votre vue. Supposons que vous retourniez une table à partir d'un assistant HTML et que vous souhaitiez ajouter un attribut de classe. Si vous utilisez un StringBuilder vous devez transmettre la classe en tant que paramètre.

public static string Table(...., string @class)
{
    ...
    sb.AppendFormat("class='{0}", @class);
    ...
}

// In the view
<%: Html.Table(someParams, "fancy") %>

Mais ajouter un attribut de classe à une balise HTML ne relève pas d'une méthode d'extension qui crée un tableau! Si nous basculons vers un modèle sémantique (TagBuilder) pour générer le code HTML, nous pouvons ajouter l'attribut de classe en dehors de la méthode table.

public static TagBuilder Table(....)
{
    ...
    return tag;
}

// In the view
<%: Html.Table(someParams).AddCssClass("fancy") %>

Outre TagBuilder, vous pouvez également consulter la bibliothèque HtmlTags de FubuMVC. C'est un modèle bien meilleur pour générer du HTML. J'ai quelques détails supplémentaires sur le blog.


N'oubliez pas de faire l'encodage HTML des valeurs si vous utilisez StringBuilder. J'espère que TagBuilder le fera automatiquement.


TagBuilder est une classe spécialement conçue pour la création de balises HTML et de leur contenu. Vous avez raison de dire que le résultat sera de toute façon une chaîne et que vous pouvez toujours utiliser StringBuilder pour obtenir le même résultat, mais vous pouvez faire les choses plus facilement avec TagBuilder . Disons que vous devez générer un tag:

<a href='http://www..com' class='coolLink'/>

En utilisant StringBuilder vous devez écrire quelque chose comme ceci:

var sb = new StringBuilder();
sb.Append("<a href='");
sb.Append(link);
sb.Append("' class = '");
sb.Append(ccsClass);
sb.Append("'/>");
sb.ToString();

Ce n'est pas très cool, n'est-ce pas? Et comparez comment vous pouvez le construire en utilisant TagBuilder ;

var tb = new TagBuilder("a");
tb.MergeAttribute("href",link);
tb.AddCssClass(cssClass);
tb.ToString(TagRenderMode.SelfClosing);

N'est-ce pas mieux?


C'est juste la commodité. A partir de ce tutoriel :

Vous n'avez pas vraiment besoin d'utiliser la classe TagBuilder. Vous pouvez utiliser une classe StringBuilder à la place. Cependant, la classe TagBuilder vous facilite un peu la vie.

Examinez les méthodes sur TagBuilder et demandez-vous si elles vous donnent une valeur. voudriez-vous faire la même chose vous-même manuellement dans StringBuilder chaque fois? Y a-t-il une fuite que cela fait pour vous? La fusion d'attributs, etc? Le code qui en résulte est-il plus facile à lire, en précisant que vous construisez une balise plutôt qu'une chaîne quelconque?


Comme tout le monde l'a souligné, une équipe de joueurs n'est pas une liste de joueurs. Cette erreur est faite par beaucoup de gens partout, peut-être à différents niveaux d'expertise. Souvent, le problème est subtil et parfois très grave, comme dans ce cas. De telles conceptions sont mauvaises parce qu'elles violent le principe de substitution de Liskov . L'Internet a beaucoup de bons articles expliquant ce concept par exemple, http://en.wikipedia.org/wiki/Liskov_substitution_principle

En résumé, il existe deux règles à conserver dans une relation Parent / Enfant entre les classes:

  • Un enfant ne devrait exiger aucune caractéristique moins que ce qui définit complètement le parent.
  • Un Parent ne devrait pas exiger de caractéristique en plus de ce qui définit complètement l'Enfant.

En d'autres termes, un parent est une définition nécessaire d'un enfant, et un enfant est une définition suffisante d'un parent.

Voici un moyen de réfléchir à la solution et d'appliquer le principe ci-dessus qui devrait aider à éviter une telle erreur. On devrait tester son hypothèse en vérifiant si toutes les opérations d'une classe parente sont valides pour la classe dérivée à la fois structurellement et sémantiquement.

  • Une équipe de football est-elle une liste de joueurs de football? (Est-ce que toutes les propriétés d'une liste s'appliquent à une équipe dans le même sens)
    • Une équipe est-elle une collection d'entités homogènes? Oui, l'équipe est une collection de joueurs
    • L'ordre d'inclusion des joueurs est-il descriptif de l'état de l'équipe et l'équipe s'assure-t-elle que la séquence est conservée à moins d'être explicitement modifiée? Non, et non
    • Les joueurs devraient-ils être inclus / abandonnés en fonction de leur position séquentielle dans l'équipe? Non

Comme vous le voyez, seule la première caractéristique d'une liste est applicable à une équipe. D'où une équipe n'est pas une liste. Une liste serait un détail d'implémentation de la façon dont vous gérez votre équipe, elle ne devrait donc être utilisée que pour stocker les objets joueurs et être manipulée avec des méthodes de classe Team.

À ce stade, je voudrais faire remarquer qu'une classe d'équipe ne devrait, à mon avis, même pas être mise en œuvre en utilisant une liste; il devrait être implémenté en utilisant une structure de données Set (HashSet, par exemple) dans la plupart des cas.







c# asp.net-mvc extension-methods stringbuilder tagbuilder