Mi pregunta es la siguiente: ¿La concatenación de cadenas en C# es segura? Si la concatenación de cadenas conduce a errores inesperados, y el reemplazo de esa cadena de concatenación mediante StringBuilder hace que esos errores desaparezcan, ¿qué podría indicar eso?Concatenación de cadenas insegura en C#, ¿necesita usar StringBuilder?
Antecedentes: Estoy desarrollando una aplicación de línea de comando pequeña C#. Toma argumentos de línea de comandos, realiza una consulta SQL ligeramente complicada y genera aproximadamente 1300 filas de datos en un archivo XML formateado.
Mi programa inicial siempre funcionaría bien en modo de depuración. Sin embargo, en el modo de lanzamiento, llegaría aproximadamente al 750º resultado de SQL y luego moriría con un error. El error fue que una cierta columna de datos no se podía leer, incluso a través del método Read() del objeto SqlDataReader que acaba de devolver verdadero.
Este problema se solucionó al usar StringBuilder para todas las operaciones en el código, donde anteriormente había habido "cadena1 + cadena2". No estoy hablando de concatenación de cadenas dentro del bucle de consulta SQL, donde StringBuilder ya estaba en uso. Estoy hablando de concatenaciones simples entre dos o tres variables cortas de cadena anteriores en el código.
Tuve la impresión de que C# era lo suficientemente inteligente como para manejar la gestión de memoria y agregar algunas cadenas. ¿Me equivoco? ¿O esto indica algún otro tipo de problema de código?
¿Podría pegar el fragmento de código con la concatenación de cadenas frente a la versión de StringBuilder? La única razón por la que podría pensar que se puede obtener una diferencia con la concatenación de cadenas frente a StringBuilder es que se llama a la sobrecarga de algunas cosas, pero eso no debería tener un efecto como el que está describiendo. –
Código original: string filepath = ruta + raíz de archivo + ".xml"; Código actualizado: cadena filepath = new StringBuilder (ruta) .Append (fileroot) .Append (".xml"). ToString(); Hice cambios como ese en varios lugares. Todos estos son antes del ciclo principal. Dentro del ciclo principal, siempre he estado usando StringBuilder para crear el contenido del archivo XML. (No estoy usando XML API porque fue más rápido, y se supone que es un programa rápido y sucio) –