Вопрос

Мой коллега новичок в 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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top