Объединение против пустой конкатенации строк
мой коллега новичок в C# и не знал об операторе объединения. Итак, я видел, как он написал такую строку кода:
string foo = "" + str;
идея заключается в том, что если str равен null, это выражение вернет пустую строку. Конечно, это можно было бы переписать так:
string foo = str ?? "";
и я чувствую, что это было бы более читаемым. Но разве это так важно? Достаточно ли преимуществ читаемости, чтобы предложить вернуться и сделать эти строки похожими на вторые? Или это одна из тех вещей, которые я должен научиться отпускать (при условии, что мой коллега обучен лучшему способу сделать это в будущем)?
редактировать: просто примечание, Я ценю комментарии по эффективности, но это на самом деле не используется в любых ситуациях, когда эта производительность будет критической. Поэтому, хотя эта информация интересна, это не обязательно то, что я чувствую важным.
7 ответов
IMO, гораздо лучше четко определить такую логику, т. е. не использовать конкатенацию строк, чтобы избежать нулевой строки и использовать условный оператор или ?? оператор.
по поводу других комментариев:
также преимущество представления к использование оператора null-coalescing, поскольку нет необходимости конкатенации (и, следовательно, без дополнительной строки создается экземпляр без надобности)
Не правда. Компилятор C# компилирует "" + string2 на 100% такой же код, как string1 ?? "". Кроме того, компилятор C# переводит оператор + для вызова string.Concat метод, который в свою очередь проверяет аргументы со строкой.IsNullOrEmpty функция и не выделяет новую строку в этом случае.
также я бы рекомендовал использовать Строка.Пустой над "" как это константа и не требует создание новой строки
.NET framework поддерживает интернировании строк так "" и строка.Пустая точка в той же области памяти
Я не думаю, что один читается больше, чем другой лично. Я предпочитаю это:
string foo = str ?? "";
просто потому, что мне очень нравится ?? оператор.
Если вы новичок, я думаю, что это было бы немного легче понять:
string foo = str == null ? "" : str;
или
string foo = "";
if (str != null) foo = str;
однако вам нужно спросить себя: "насколько просто вы действительно хотите получить?"
хотя я предпочитаю вторую строку с технической точки зрения, первая строка на самом деле более читаема для меня...
Я бы предпочел ваш второй пример первому, поскольку он более проактивен против str
null и более выразительным. также я бы рекомендовал использовать String.Empty
над ""
поскольку он является константой и не требует создания нового String
(и да, это крайняя придирка, но важно отметить).
Я бы использовал оператор объединения или foo = str == null ? "" : str;
по двум причинам:
первый пример не имеет такого же поведения в других языках фигурных скобок (особенно Java и JavaScript), где добавление нулевой ссылки на пустую строку приводит к строке, содержащей текст
null
. В результате первый пример требует гораздо больших умственных усилий, чтобы гарантировать, что он приведет к правильному поведению на языке автора. Даже учитывая другие подсказки, это C# (например, строчный типstring
), все, что требует от разработчика замедлить и подумать "в чем смысл этого кода", приводит к потере производительности. Он также может вводить ошибки при переходе от языка к языку.-
второй пример более четко выражает намерение кода, который, как описано в исходном вопросе:
when str is null set foo to an empty string
в отличие от первого примера, который можно прочитать as:
set foo to an empty string with str appended (which may have the side effect of setting foo to an empty string when str is null)
как программисты, мы, вероятно, должны попытаться выразить намерение наш код, а не полагаться на побочные эффекты других операций, чтобы дать нам результаты, которые мы хотим.