С#: наиболее читаемая конкатенация строк. передовая практика
Возможный дубликат:
Как объединить строки?
Существует несколько способов concat строк в повседневных задачах, когда производительность не важна.
-
result = a + ":" + b
-
result = string.Concat(a, ":", c)
-
result = string.Format("{0}:{1}", a, b);
-
StringBuilder approach
- ...?
что вы предпочитаете и почему, если эффективность не имеет значения, но вы хотите, чтобы код был наиболее читаемым для вашего вкуса?
Ответы
Ответ 1
string.Format
для меня, но на практике я использую то, что подходит для цели, с учетом производительности и удобочитаемости.
Если бы это были две переменные, которые я использовал бы.
string.Concat(str1, str2);
Если в нем содержится константа или что-то, что требует форматирования.
string.Format("{0} + {1} = {2}", x, y, x + y);
Или для чего-то вроде SQL-запроса
string SqlQuery = "SELECT col1, col2, col3, col4" +
"FROM table t " +
"WHERE col1 = 1";
И построитель строк, когда имеет значение производительность.
Ответ 2
Это зависит от использования. Когда вы просто хотите конкатрировать две строки, использование a + b
является гораздо более читаемым, чем string.Format("{0}{1}", a, b)
. Однако он становится более сложным, я предпочитаю использовать string.Format
. Сравните это:
string x = string.Format("-{0}- ({1})", a, b);
против
string x = "-" + a + "- (" + b + ")";
Я думаю, что в большинстве случаев очень легко определить наиболее читаемый способ делать что-то. В тех случаях, когда дискуссионно, какой из них более читабельен, просто выберите один, потому что ваш босс не платит за эти бессмысленные обсуждения; -)
Ответ 3
String.Format(...)
является самым медленным.
Для простых конкатенаций, которые не выполняются в цикле, используйте оператор String.Concat(...)
или +
, который переводится в ту же область под капотом afaik. То, что более читаемо, очень субъективно.
Использование StringBuilder
для простых конкатенаций также сверхпростой для простых конкатенаций и, скорее всего, слишком много накладных расходов. Я использовал бы его только в цикле.
Ответ 4
Что-то вроде этого (которое, как я предполагаю, отправляется в пользовательский интерфейс), я бы предпочел String.Format
. Это позволяет легко интернационализировать строку; вы можете grep для вызовов String.Format
и заменить их на ваш переводный формат.
Ответ 5
Мои личные предпочтения:
Я нахожу подход + к наиболее читабельному и использую только Format() или StringBuilder, если для этого есть веская причина (i18n, производительность и т.д.). Я (почти) никогда не использую Concat.
Я считаю, что подход "+" легче читать, чем Format(), просто потому, что мне не нужно переходить к концу, чтобы увидеть, какие переменные помещаются в {} place-holder. И если держатели мест не имеют числового порядка, становится еще труднее читать imo.
Но я предполагаю, что для более крупных проектов имеет смысл просто принудительно применять формат "Формат" с помощью руководства по стилю, только если код может быть (повторно) использован в проекте, требующем позже i18n.
Ответ 6
даже если производительность не важна. есть командная договоренность, которую я должен соблюдать
Ответ 7
Я предпочитаю String.Format для маленьких строк и StringBuilder для более крупных. Моя основная причина - читаемость. Мне гораздо удобнее использовать String.Format(или StringBuilder.AppendFormat()), но я должен признать, что это только личное предпочтение.
Для действительно большого генерации текста вам может потребоваться использовать новый (VS2010) T4 Preprocessed Templates - они действительно приятные.
Кроме того, если вы когда-либо находитесь в VB.NET, мне нравится XML-литературная техника, о которой Кэтлин Доллард говорила в эпизоде 152 hanselminutes.
Ответ 8
Предпочитает использовать:
String.Concat
для простых конкатенаций типа String.Concat("foo", bar);
String.Format
для сложного форматирования, например String.Format("<a href=\"{0}\">{1}</a>", url, text);
StringBuilder
для массивных конкатенаций типа:
var sb = new StringBuilder();
sb.AppendLine("function fooBar() {");
sp.AppendLine(String.Join(Environment.NewLine, blah));
sp.AppendLine("}");
page.RegisterClientScript(page.GetType(), sb.ToString());
Предпочитают избегать "foo" + "bar"
(а также if (foo == "bar")
. И особенно String.Format("{0}{1}", foo, bar)
и
throw new Exception("This code was" +
"written by developer with" +
"13\" monitor");