Обратите внимание, что
string msg = "Your total is ";
msg += "$500 ";
msg += DateTime.Now;
компилируется до
string msg = String.Concat("Your total is ", "$500 ");
msg = String.Concat(msg, DateTime.Now.ToString());
Это составляет два конкатата и одну ToString за итерацию.Кроме того, один String.Concat действительно быстр, потому что он знает, насколько большой будет результирующая строка, поэтому он выделяет результирующую строку только один раз, а затем быстро копирует в нее исходные строки.Это означает, что на практике
String.Concat(x, y);
всегда будет превосходить
StringBuilder builder = new StringBuilder();
builder.Append(x);
builder.Append(y);
, потому что StringBuilder не может использовать такие ярлыки (вы можете вызвать их присоединение или удаление, что невозможно с помощью String.Concat).
Способ работы StringBuilder заключается в выделении начального буфера и установке длины строки равной 0. При каждом добавлении он должен проверять буфер, возможно выделять больше места в буфере (обычно копируя старый буфер в новыйбуфер), скопируйте строку и увеличьте длину строки компоновщика.String.Concat не нужно выполнять всю эту дополнительную работу.
Так что для простых конкатенаций строк x + y (т. Е. String.Concat) всегда будет превосходить StringBuilder.
Теперь выВы начнете получать преимущества от StringBuilder, как только начнете объединять множество строк в один буфер или будете выполнять множество манипуляций с буфером, где вам нужно будет продолжать создавать новые строки, когда не используется StringBuilder.Это связано с тем, что StringBuilder лишь изредка выделяет новую память порциями, а String.Concat, String.SubString и т. Д. (Почти) всегда выделяют новую память.(Что-то вроде "" .SubString (0,0) или String.Concat ("", "") не будет выделять память, но это вырожденные случаи.)