Объединить или объединить пустую строку - PullRequest
8 голосов
/ 06 января 2009

Мой коллега является новичком в C # и не знал об операторе coalesce. Итак, я видел, как он написал такую ​​строку кода:

string foo = "" + str;

Идея состоит в том, что если str равен нулю, это выражение вернет пустую строку. Конечно, это можно переписать так:

string foo = str ?? "";

И я чувствую, что это было бы более читабельным. Но разве это так важно? Достаточно ли преимуществ читабельности, чтобы предложить вернуться и сделать эти строки похожими на вторую? Или это одна из тех вещей, которые я должен научиться отпускать (при условии, что мой коллега обучен наилучшему способу сделать это в будущем)?

РЕДАКТИРОВАТЬ : просто замечание, я ценю комментарии по эффективности, но это на самом деле не используется ни в каких ситуациях, когда такая производительность была бы критической. Поэтому, хотя эта информация интересна, это не обязательно то, что я считаю важным.

Ответы [ 7 ]

10 голосов
/ 06 января 2009

IMO, гораздо лучше четко определить такую ​​логику, т. Е. Не использовать конкатенацию строк, чтобы избежать пустых строк и использовать условный оператор или ?? оператор.

По поводу других комментариев:

есть также выигрыш в производительности используя нуль-коалесцирующий оператор, поскольку никакой конкатенации не требуется (и, следовательно, без дополнительной строки экземпляр создается излишне)

Не правда. Компилятор C # компилирует "" + string2 в тот же код, что и string1 ?? "". Более того, компилятор C # переводит оператор + для вызова метода string.Concat, который, в свою очередь, проверяет аргументы с помощью функции string.IsNullOrEmpty и в этом случае не выделяет новую строку.

Также я бы порекомендовал использовать String.Empty over "" как это постоянный и не требует создание новой строки

.NET Framework поддерживает интернирование строк so "" и string.Empty указывают на одну и ту же область памяти

3 голосов
/ 06 января 2009

Я не думаю, что одно лучше читается, чем другое лично. Я предпочитаю это:

string foo = str ?? "";

просто потому, что мне действительно нравится ?? оператор.

Если вы новичок, думаю, это будет немного легче понять:

string foo = str == null ? "" : str;

или

string foo = "";
if (str != null) foo = str;

Однако вам нужно спросить себя: «Насколько просто вы действительно хотите это сделать?»

2 голосов
/ 06 января 2009

Хотя я предпочитаю вторую строку с технической точки зрения, первая строка на самом деле мне удобнее читать ...

1 голос
/ 06 января 2009

Я бы использовал оператор объединения или foo = str == null ? "" : str; по двум причинам:

  1. Первый пример не имеет такого же поведения в других языках фигурных скобок (особенно в Java и JavaScript), где добавление пустой ссылки на пустую строку приводит к строке, содержащей текст null. В результате, первый пример требует гораздо больше умственных усилий, чтобы гарантировать, что он приведет к правильному поведению на создаваемом языке. Даже с учетом других подсказок, что это C # (например, строчный тип string), все, что требует от разработчика замедления и размышлений «какова цель этого кода», приводит к снижению производительности. Это также может привести к ошибкам при переходе с языка на язык.

  2. Второй пример более четко выражает намерение кода, которое, как описано в исходном вопросе:

    when str is null set foo to an empty string

    В отличие от первого примера, который можно прочитать как:

    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)

Как программисты, мы, вероятно, должны пытаться выразить намерение нашего кода, а не полагаться на побочные эффекты других операций, чтобы дать нам желаемые результаты.

1 голос
/ 06 января 2009

Вторая строка выглядит более читабельной для меня, она проясняет смысл выражения правой стороны.

1 голос
/ 06 января 2009

Я бы предпочел ваш второй пример первому, поскольку он более активен против str, будучи нулевым и более выразительным. Также я бы порекомендовал использовать String.Empty сверх "", поскольку оно является константой и не требует создания нового String (и да, это крайне придирчиво, но важно отметить).

0 голосов
/ 06 января 2009

вот статья о string.empty vs ""

http://blogs.msdn.com/brada/archive/2003/04/22/49997.aspx

...