2010-07-18 21 views
13

Duplicar posible:
How should I concatenate strings?C#: concatenación de cadenas más legible. las mejores prácticas

Hay varias maneras de ConCat cadenas en las tareas cotidianas cuando el rendimiento no es important.

  • result = a + ":" + b
  • result = string.Concat(a, ":", c)
  • result = string.Format("{0}:{1}", a, b);
  • StringBuilder approach
  • ...?

¿Qué prefiere y por qué si la eficiencia no es importante pero desea mantener el código más legible para su gusto?

+0

sí, que parecen similares pero quiero concentrarse en los aspectos legibilidad no en consideraciones de implementación y funcionamiento internos. –

+0

FWIW, creo que el operador '+' asigna el método 'Concat' de todos modos, por lo que los primeros dos ejemplos son equivalentes. –

+0

@musicfreak: desde una perspectiva de IL, podrían ser equivalentes, desde una perspectiva de legibilidad ciertamente no lo son. – Steven

Respuesta

8

string.Format para mí, pero en la práctica uso lo que sea apropiado para el propósito, teniendo en cuenta el rendimiento y la legibilidad.

Si fueran dos variables las usaría.

string.Concat(str1, str2);

Si contenía una constante o algo que requiere el formato a continuación.

string.Format("{0} + {1} = {2}", x, y, x + y);

O para algo así como una consulta SQL

string SqlQuery = "SELECT col1, col2, col3, col4" + 
        "FROM table t " + 
        "WHERE col1 = 1"; 

Y generador de cadenas de conseguir un alto rendimiento.

+0

La optimización prematura es la raíz de todo mal. O algo así. – strager

+1

+1 por motivos de legibilidad. –

+0

+1 para el método. Incluso he creado un atajo. Lo uso con tanta frecuencia – gnome

2

String.Format(...) es el más lento.

Para concatenaciones simples que no tienen lugar en un bucle, use String.Concat(...) o el operador +, que se traduce en el mismo debajo del capó, afaik. Lo que es más legible es muy subjetivo.

El uso de StringBuilder para concatenaciones simples es exagerado para concatenaciones sencillas y tiene muy probablemente demasiada sobrecarga. Solo lo usaría en un bucle.

+0

Gracias, pero ¿cómo se concatena cadenas ordinarias? Formato, +, Concat? –

+0

No tomaría la decisión basándose únicamente en el RENDIMIENTO, a menos que el rendimiento sea absolutamente crítico y se PROBÓ que una llamada String.Format en particular tuviera la culpa de serios problemas de rendimiento. En general, debe preferir la legibilidad y la facilidad de mantenimiento para el rendimiento. Habiendo dicho eso, no tengo ningún problema con esta respuesta, ya que es objetiva, pero me sorprende que la consecuencia es que el rendimiento es el rey, y en realidad debería ser su última consideración dado que la diferencia de velocidad se mide en fracciones de milisegundos. – mattmc3

+2

La forma más 'normal' es usar '+' o 'Concat', que se traduce en lo mismo bajo el capó afaik, y que le resulta más legible es muy subjetivo. No usaría 'String.Format (...)' para cosas simples porque es más lento (tiene que analizar la cadena de formato) y es más propenso a errores. – herzmeister

1
  • string.Format

    de unos concats. para más utilizo

  • enfoque StringBuilder

incluso si el rendimiento no es importante. hay un acuerdo de equipo que tengo que seguir

+0

Gracias, hacemos lo mismo. Aunque algunos desarrolladores tienden a usar + –

2

Para algo como esto (que supongo que se enviará a la interfaz de usuario), definitivamente preferiría String.Format.Permite que la cadena sea internacionalizada fácil; puede grep para llamadas al String.Format y reemplazarlos con su formato de traducción.

+1

+1 para el punto en la localización. –

2

Mi preferencia personal es:

encuentro el + acercarse la más legible y sólo utilizar el formato() o un StringBuilder si hay una buena razón (i18n, rendimiento, etc.) para ello. Yo (casi) nunca uso Concat.

Creo que el método + me resulta más fácil de leer que Format() simplemente porque no tengo que saltar hasta el final para ver qué variables se colocan en los {} marcadores de posición. Y si los place-titders no están en orden numérico, es aún más difícil leer imo.

Pero supongo que para proyectos más grandes tiene sentido simplemente hacer cumplir el uso de Format con una guía de estilo en caso de que el código pueda ser (re) utilizado en un proyecto que requiera i18n más adelante.

8

Depende del uso. Cuando solo desea usar dos cadenas, utilizar a + b es mucho más legible que string.Format("{0}{1}", a, b). Sin embargo, cada vez es más complejo, prefiero usar string.Format. Compare esto:

string x = string.Format("-{0}- ({1})", a, b); 

contra:

string x = "-" + a + "- (" + b + ")"; 

Creo que en la mayoría de los casos, es muy fácil de detectar la forma más legible para hacer las cosas. En los casos en que es discutible cuál es más legible, solo elija uno, porque su jefe no está pagando por estas discusiones inútiles ;-)

+2

+1 para la última frase. :) La mayoría de las veces realmente no importa; podría estar haciendo algo más productivo que decidir qué método de concatenación de cadenas usar. –

+3

De acuerdo, pero es difícil medir el tiempo invertido en volver a aprender lo que usted u otra persona hizo cuando tiene que mantener ese código. A menudo, los pocos segundos extra dedicados a facilitar la lectura y la comprensión le ayudarán a ahorrar más adelante cuando aún no se haya entendido del todo y tenga que arreglar algo. Entonces quiere escribir un código comprensible y desarrollar buenos hábitos. El mantenimiento es uno de los mayores costos para sus desarrolladores, y es algo que definitivamente debería preocupar a su jefe. – mattmc3

+2

@mattmc: DGMW: Creo que la mantenibilidad es (después de la corrección) los aspectos más importantes del software. He visto muchos códigos pobres en mi carrera que se convirtieron en una pesadilla de mantenimiento. Discutirlo con sus universidades es importante para obtener un consenso general sobre lo que es más legible. Sin embargo, siempre hay una compensación entre eso y la productividad. Como dijiste, es difícil medir dónde se encuentra el punto de equilibrio. Tener estas discusiones es útil hasta cierto punto. Lo que traté de decir fue que no es muy útil tener discusiones interminables sobre varios sabores que son demasiado cercanos en legibilidad. – Steven

1

Prefiero String.Format para cadenas pequeñas, y StringBuilder para las más grandes. Mi razón principal es la legibilidad. Me resulta mucho más fácil usar String.Format (o StringBuilder.AppendFormat()), pero debo admitir que eso es solo una preferencia personal.

Para la generación de texto realmente grande, es posible que desee considerar el uso de las nuevas plantillas preprocesadas (VS2010) T4: son realmente agradables.

Además, si alguna vez está en VB.NET, me gusta la técnica literal de XML de la que habló Kathleen Dollard en episode 152 of hanselminutes.

+0

También tenga en cuenta que 'string.Format' utiliza un' StringBuilder' internamente. – Steven

1

prefieren utilizar:

String.Concat para concatenaciones simples como String.Concat("foo", bar);

String.Format para el formateo complejo como String.Format("<a href=\"{0}\">{1}</a>", url, text);

StringBuilder para concatenaciones masivos como:

var sb = new StringBuilder(); 
sb.AppendLine("function fooBar() {"); 
sp.AppendLine(String.Join(Environment.NewLine, blah)); 
sp.AppendLine("}"); 
page.RegisterClientScript(page.GetType(), sb.ToString()); 

prefieren evitar "foo" + "bar" (así como if (foo == "bar"). Y especialmente String.Format("{0}{1}", foo, bar) y

throw new Exception("This code was" + 
    "written by developer with" + 
    "13\" monitor"); 
Cuestiones relacionadas