Объединение против конкатенации пустых строк
-
03-07-2019 - |
Вопрос
Мой коллега новичок в C# и не знал об операторе объединения.Итак, я видел, как он написал такую строку кода:
string foo = "" + str;
Идея состоит в том, что если строка равна нулю, это выражение вернет пустую строку.Конечно, это можно было бы переписать так:
string foo = str ?? "";
И я чувствую, что это было бы более читабельно.Но действительно ли это так уж важно?Достаточно ли преимуществ читабельности, чтобы предложить вернуться назад и сделать эти строки похожими на вторые?Или это одна из тех вещей, которые мне следует научиться отпускать (при условии, что мой коллега знает, как лучше всего делать это в будущем)?
РЕДАКТИРОВАТЬ:Просто примечание: я ценю комментарии по эффективности, но на самом деле это не используется ни в каких ситуациях, когда производительность была бы критичной.Так что, хотя эта информация и интересна, она не обязательно является тем, что я считаю важным.
Решение
ИМО, гораздо лучше четко определить такую логику, т.е.не используйте конкатенацию строк, чтобы избежать нулевой строки и использовать условный оператор или ??оператор.
Что касается других комментариев:
Существует также выгода от использования оператора с нулевым капиталом, поскольку не требуется никакой конкатенации (и, следовательно, не создается дополнительного строкового экземпляра без необходимости)
Не правда.Компилятор C# компилирует "" + string2 в 100% тот же код, что и string1 ??"".Более того, компилятор C# преобразует оператор + для вызова метода string.Concat, который, в свою очередь, проверяет аргументы с помощью функции string.IsNullOrEmpty и в этом случае не выделяет новую строку.
Также я бы порекомендовал использовать string.empty over "" ", так как это постоянная и не требует создания новой строки
.NET Framework поддерживает строковое стажирование поэтому "" и string.Empty указывают на одну и ту же область памяти.
Другие советы
Лично я не думаю, что одно из них более читабельно, чем другое.Я предпочитаю это:
string foo = str ?? "";
просто потому, что мне очень нравится ??оператор.
Если вы новичок, я думаю, вам будет немного проще понять:
string foo = str == null ? "" : str;
или
string foo = "";
if (str != null) foo = str;
Однако вам нужно спросить себя: «Насколько просто вы действительно хотите?»
Хотя я предпочитаю вторую строку с технической точки зрения, первая строка на самом деле более читабельна для меня ...
Вторая строка выглядит более читабельной для меня, она проясняет смысл выражения правой части.
Я бы предпочел ваш второй пример первому, так как он более активен, поскольку str
является нулевым, и более выразителен. Также я бы порекомендовал использовать String.Empty
над " "
, поскольку он является константой и не требует создания новой строки
(и да, это очень придирчиво, но важно отметить).
Я бы использовал оператор объединения или foo = str == null? & Quot; & Quot; : str;
по двум причинам:
Первый пример не имеет такого же поведения в других языках фигурных скобок (особенно в Java и JavaScript), где добавление пустой ссылки на пустую строку приводит к строке, содержащей текст null код>. В результате первый пример требует гораздо больше умственных усилий, чтобы гарантировать, что он приведет к правильному поведению на языке, который создается. Даже учитывая другие подсказки, это C # (например, строчный тип
string
), все, что требует от разработчика замедления и обдумывания "какова цель этого кода"? приводит к потере производительности. Это также может привести к ошибкам при переходе с языка на язык.
Второй пример более четко выражает намерение кода, как описано в исходном вопросе:
когда str равен нулю, установите foo в пустую строку
В отличие от первого примера, который можно прочитать как:
устанавливает foo в пустую строку с добавленной str (что может иметь побочный эффект при установке foo в пустую строку, когда str имеет значение null)
Как программисты, мы, вероятно, должны пытаться выразить намерение нашего кода, а не полагаться на побочные эффекты других операций, чтобы дать нам желаемые результаты.
вот статья о string.empty vs "
http://blogs.msdn.com/brada /archive/2003/04/22/49997.aspx р>