metodos - stringbuilder c# español
¿Por qué usar TagBuilder en lugar de StringBuilder? (6)
¿Cuál es la diferencia al usar tag builder y string builder para crear una tabla en una clase htmlhelper o usar HtmlTable?
¿no están generando lo mismo?
¿no están generando lo mismo?
Bueno, claro, pero eso no debería ser un impedimento, ¿o sí? Una clase está diseñada para algo más específico que la otra, por lo que ofrece un mayor nivel de conveniencia.
Podría preguntar: ¿por qué usar un StringBuilder
? ¿Por qué no una List<char>
? ¿No podría generar lo mismo de cualquiera?
Yendo un paso más allá: ¿por qué incluso una List<char>
? ¿Por qué no solo un char[]
, cuyo cambio de tamaño / manipulación puedo controlar yo mismo? Todavía puedo crear totalmente una string
de un char[]
.
De hecho, todo lo que realmente necesito es un char*
y un int
(de longitud). ¿Derecha?
Mi punto es que si hay una clase disponible para funcionalidades especializadas que puedas usar, tiene sentido usarla si me preguntas.
Como se menciona en las otras publicaciones, TagBuilder ofrece cierta comodidad. Pero debe considerar que TagBuilder y StringBuilder pueden no producir el mismo resultado. TagBuilder aplica codificación html, pero StringBuilder no lo hace. Por lo tanto, es más seguro usar TagBuilder para superar las vulnerabilidades que pueden explotarse a través del ataque XSS.
Es solo conveniencia. De este tutorial :
Realmente no necesita usar la clase TagBuilder. Podría usar una clase StringBuilder en su lugar. Sin embargo, la clase TagBuilder te hace la vida un poco más fácil.
Mire los métodos en TagBuilder y piense si le dan valor. ¿Te gustaría hacer lo mismo manualmente en StringBuilder
todo el tiempo? ¿Hay escapatoria que lo haga por ti? Fusión de atributos, etc. ¿El código resultante es más fácil de leer, por lo que es más claro que está creando una etiqueta en lugar de una cadena arbitraria?
Hay un punto que las otras respuestas se han perdido hasta ahora. Si devuelve TagBuilder
desde un método de extensión puede continuar agregando atributos en su vista. Supongamos que devuelve una tabla de un helper Html y desea agregar un atributo de clase. Si está usando un StringBuilder
necesita pasar la clase como un parámetro.
public static string Table(...., string @class)
{
...
sb.AppendFormat("class=''{0}", @class);
...
}
// In the view
<%: Html.Table(someParams, "fancy") %>
¡Pero agregar un atributo de clase a una etiqueta HTML no es asunto de un método de extensión que crea una tabla! Si cambiamos a un modelo semántico (TagBuilder) para generar el HTML, podemos agregar el atributo de clase fuera del método de tabla.
public static TagBuilder Table(....)
{
...
return tag;
}
// In the view
<%: Html.Table(someParams).AddCssClass("fancy") %>
Además de TagBuilder, es posible que desee consultar la biblioteca HtmlTags de FubuMVC. Es un modelo mucho mejor para generar HTML. Tengo algunos detalles más en el blog.
No olvides hacer una codificación HTML de valores si estás usando StringBuilder. Espero que TagBuilder haga esto automáticamente.
TagBuilder
es una clase especialmente diseñada para crear etiquetas html y su contenido. Tiene razón al decir que el resultado será de todos modos una cadena y, por supuesto, aún puede usar StringBuilder
y el resultado será el mismo, pero puede hacer las cosas más fácilmente con TagBuilder
. Digamos que necesitas generar una etiqueta:
<a href=''http://www..com'' class=''coolLink''/>
Usando StringBuilder
necesitas escribir algo como esto:
var sb = new StringBuilder();
sb.Append("<a href=''");
sb.Append(link);
sb.Append("'' class = ''");
sb.Append(ccsClass);
sb.Append("''/>");
sb.ToString();
No es muy bueno, ¿no? Y compare cómo puede compilarlo usando TagBuilder
;
var tb = new TagBuilder("a");
tb.MergeAttribute("href",link);
tb.AddCssClass(cssClass);
tb.ToString(TagRenderMode.SelfClosing);
¿No es eso mejor?