Подтвердить что ты не робот

Зачем использовать String.Concat() в С#?

Мне это интересно некоторое время. Зачем использовать String.Concat() вместо использования оператора plus. Я понимаю String.Format, так как это пустоты, использующие оператор плюс, и сделать ваш код более приятным.

например,

string one = "bob";
string two = "jim";

string three = one + two;
string three = String.Concat(one,two);
4b9b3361

Ответ 1

Пока два операнда являются строками, нет никакой разницы между использованием оператора + и метода String.Concat. Код, использующий оператор +, фактически компилируется в вызов String.Concat.

Используйте тот, который наилучшим образом представляет ваше намерение с кодом.

Ответ 2

Я использую +, когда знаю, сколько строк будет конкатенировано, но что, если у вас просто есть массив? В этом случае вы не знаете, сколько раз применять +, поэтому вам придется вызвать метод (или зациклиться на себе, что ужасно).

Я не могу часто называть string.Concat, хотя это определенная редкость.

Как говорит guffa, + в любом случае компилируется на вызовы string.Concat - стоит знать, что string на самом деле не имеет оператора +, что может быть причиной путаницы, если вы когда-либо пытаетесь использовать это в отражении!

Одно из преимуществ + заключается в том, что если все аргументы являются постоянными выражениями, компилятор выполнит для вас конкатенацию, поэтому вам не нужно делать это во время выполнения. Такое незначительное преимущество в производительности не будет значительным в большинстве кодов, но всегда приятно, когда код, который я нахожу наиболее читаемым, также имеет преимущество в производительности:)

Ответ 3

У меня сам был такой же вопрос, и этот вопрос заставлял меня немного расследовать его,

Я создал следующий класс

public class Class1
{
    string str = "One" + "Team";
    string str2 = string.Concat("One", "Team");
}

И ниже для этого соответствует IL-код.

.method public hidebysig specialname rtspecialname 
        instance void .ctor() cil managed
{ 
    // Code size        40 (0x28)   
    .maxstack  8   
    IL_0000:  ldarg.0   
    IL_0001:  ldstr     "OneTeam"   
    IL_0006:  stfld     string StringConcat.Class1::str  
    IL_000b:  ldarg.0   
    IL_000c:  ldstr     "One"   
    IL_0011:  ldstr     "Team"  
    IL_0016:  call      string [mscorlib]System.String::Concat(string, string)   
    IL_001b:  stfld     string StringConcat.Class1::str2   
    IL_0020:  ldarg.0   
    IL_0021:  call      instance void [mscorlib]System.Object::.ctor()  
    IL_0026:  nop   
    IL_0027:  ret 
    // end of method Class1::.ctor
} 

Для меня определенно выглядит, что string.Concat имеет больше шагов, чем перегруженный + оператор. Но я точно знаю, что внутри класса System.String будет выполняться аналогичный набор операций для перегруженного + оператора. Мысли?

Ответ 4

Поскольку вы можете использовать версию, которая принимает два объекта;)

Ответ 5

Переносимость (ваша).

В других языках + может не конкатенироваться, как вы ожидаете, когда представлены двумя строками. Это может сделать что-то совершенно неожиданное. Или, в некоторых свободно типизированных языках, если вы разбиваете + между целочисленной или числовой скалярной переменной и строкой, это может не вызвать предупреждение компилятора, попытаться преобразовать strung в числовое и добавить их.

Для сравнения .concat() в некоторых случаях достаточно понятен и доступен для чтения по сравнению с +.

Ответ 6

Честно говоря; некоторые люди предпочитают это. Я знаю, что я предпочел бы использовать Concat, поскольку + действительно не очень интуитивно понятен. Особенно просто глядя на код в глубину; сложно определить, являются ли эти цифры, которые вы добавляете, или две строки, которые вы выполняете, или две точки, с которыми вы делаете добавление векторов.:)

Ответ 7

Я считаю, что он такой же, как строка a + string b. Строковый тип в С#, являющийся immutable, поэтому предпочтительным способом манипуляции с строкой является StringBuilder. По словам Гуффа, "используйте тот, который лучше всего представляет ваше намерение с кодом". Конечно, для простого использования, когда производительность не слишком важна, используйте + или concat.

Ответ 8

Оператор + является математическим оператором. Поэтому, прежде чем конкатенировать строку с помощью этого оператора, компилятору придется решить, использовать ли его в качестве математического оператора для добавления или использовать его для конкатенации строк.

Например: если вы объединяете + b + c + d + e + f, компилятор будет принимать решение 5 раз, поскольку существует оператор 5 +.

Производительность не рекомендуется.

Однако, если у вас есть только одна конкатенация, я не думаю, что существует большая разница в производительности при использовании метода + или Concat()