Toda la concatenación de cadenas en .NET (con los operadores estándar, es decir, +) requiere que el tiempo de ejecución reserve suficiente memoria para una cadena completa nueva para contener los resultados de la concatenación. Esto se debe a que el tipo de cadena es inmutable.
Si realiza la concatenación de cadenas muchas veces (es decir, dentro de un bucle, etc.) sufrirá problemas de rendimiento (y eventualmente problemas de memoria si la cadena es suficientemente grande) ya que el tiempo de ejecución .NET necesita asignar y desasignar continuamente la memoria espacio para contener cada nueva cuerda.
Es probable que por esta razón piense (correctamente) que la concatenación excesiva de cadenas puede ser problemática. Tiene muy poco (si acaso) que ver con concatenar un char en lugar de un tipo de cadena.
La alternativa a esto es utilizar la clase StringBuilder en el espacio de nombres System.Text. Esta clase representa un objeto mutable similar a una cadena que se puede usar para concatenar cadenas sin la mayoría de los problemas de rendimiento resultantes. Esto se debe a que la clase StringBuilder
reservará una cantidad específica de memoria para una cadena, y permitirá que las concatenaciones se agreguen al final de la cantidad de memoria reservada sin requerir una nueva copia completa de la cadena completa.
EDIT:
Con respecto a los detalles de las búsquedas de cuerda frente a las búsquedas de carbonilla, me prepararon rápidamente esta pequeña prueba:
class Program
{
static void Main(string[] args)
{
string stringtotal = "";
string chartotal = "";
Stopwatch stringconcat = new Stopwatch();
Stopwatch charconcat = new Stopwatch();
stringconcat.Start();
for (int i = 0; i < 100000; i++)
{
stringtotal += ".";
}
stringconcat.Stop();
charconcat.Start();
for (int i = 0; i < 100000; i++)
{
chartotal += '.';
}
charconcat.Stop();
Console.WriteLine("String: " + stringconcat.Elapsed.ToString());
Console.WriteLine("Char : " + charconcat.Elapsed.ToString());
Console.ReadLine();
}
}
se limita a la hora (con el alto rendimiento StopWatch clase) cuánto tiempo lleva concatenar 100000 puntos/períodos (.
) de tipo cadena frente a 100000 puntos/períodos de tipo char. me encontré con esta prueba unas cuantas veces a lo largo para evitar que los resultados están sesgados de una carrera específica, sin embargo, cada vez que los resultados fueron similares a los siguientes:
String: 00:00:06.4606331
Char : 00:00:06.4528073
Por lo tanto, en el contexto de múltiples concatenaciones, Diría que hay muy poca diferencia (con toda probabilidad, no hay diferencia cuando se toman en cuenta las tolerancias estándar de ejecución de prueba) entre los dos.
también se debe considerar el uso de 'StringBuilder' en lugar de' '+. – thelost
Depende (TM). Si está desarrollando una aplicación para un entorno de escritorio, ni siquiera se moleste remotamente, la diferencia es completamente marginal. Si trabajas con un dispositivo integrado poco potente, entonces * * puede * valer la pena preocuparse. – Piskvor
@Patrick: Probablemente deberías enfocar la pregunta hacia la búsqueda en lugar de char, de lo contrario, todos comenzarán sobre StringBuilder. –