practices example best c# stringbuilder

c# - example - ¿Cuál es el uso del valor de retorno de la función Anexar StringBuilder(cadena...)?



stringbuilder list c# (2)

Significa que puedes encadenar llamadas fácilmente:

sb.Append("Foo=").Append(foo).Append("&Bar=").Append(bar);

... en lugar de usar varias declaraciones separadas:

sb.Append("Foo="); sb.Append(foo); sb.Append("&Bar="); sb.Append(bar);

El hecho de que sea una expresión única significa que también puede usarla en lugares donde está restringido a una sola expresión, por ejemplo, inicialización de campo o una declaración de retorno. Esto último significa que también puede usarlo para miembros con cuerpo de expresión:

public override string ToString() => new StringBuilder("x").Append(...).Append(...).ToString();

(En muchos casos, usar string.Format o un literal de cadena interpolada tendría más sentido, pero a veces StringBuilder es el camino a seguir ...)

La sintaxis completa de la función Append (string s) de StringBuilder (y funciones similares) es

StringBuilder myStringBuilder.Append(string myString)

ya que myStringBuilder.Append(string myString) ya agrega la cadena a myStringBuilder , me preguntaba para qué sirve el valor de retorno. Nunca he visto ningún código de ejemplo que haga uso del valor de retorno.

Según msdn, no devuelve una nueva instancia de StringBuilder , sino una referencia al generador actual (que sería myStringBuilder ). Simplemente no puedo pensar en un escenario cuando usar el valor de retorno tiene sentido, ¿por qué no anularon el tipo de retorno?


Solo para agregar más valor a la respuesta de Jon Skeet, vale la pena mencionar que este es un diseño de API fluido .

Tiene sus pros y sus contras, pero como Jon Skeet ya ha señalado, no solo con StringBuilder sino en muchas otras clases y marcos, es muy interesante poder configurar o ejecutar cosas con fluidez.

Tal vez el OP nunca haya visto la list.Where(x => ...).OrderBy(x => ...).Select(x => ...).ToList() . O la API de configuración fluida de Castle Windsor: Component.For<X>().ImplementedBy<Y>().LifeStyleSingleton() .

Es por eso que StringBuilder devuelve la instancia desde la cual se llamó a Append : poder llamar a otros métodos como una cadena que, a veces, parece ser más fácil de entender que muchas oraciones separadas.

Sobre los contras

@ Jason me pidió las contras en algún comentario:

Matías, ¿cuáles son los contras?

Tomado de mi propia experiencia, creo que hay algunos inconvenientes , pero uno de los más importantes podría ser que una cadena fluida puede ser más difícil de depurar, ya que no puede ir paso a paso durante una sesión de depuración interactiva (en realidad puede entrar y salir ... pero es menos cómodo que ir paso a paso ... ).

Excepto que con esta opción, considero que el diseño fluido es una buena manera de implementar código auto-documentado ya que a veces es como leer una oración en lenguaje natural y mantiene las cosas simples ( para aquellos que ya se han utilizado con un diseño fluido ... )