С# нулевая строка?

У меня было следующее:

string Name = name.First + " "  +  name.Last;

Это возвращает Tom Jones просто отлично.

В случае, если name.First может быть нулевым или name.Last может быть нулевым, у меня есть следующее:

string SpeakerName = name.First ?? string.Empty + " "  +  name.Last ?? string.Empty;

Странно то, что он возвращает только Tom. Почему это так и как я могу исправить это так, что if null по умолчанию используется пустая строка для имени или фамилии?


person Nate Pet    schedule 24.07.2012    source источник
comment
поиск приоритета оператора.   -  person zzzzBov    schedule 24.07.2012
comment
В продолжение hazzik: null преобразуется в при использовании с оператором +, где одно из выражений операнда string. например name.First + " " + name.Last в этом случае даст тот же результат. Точно так же будет работать string.Format("{0} {1}", name.First, name.Last). Однако, как правило, "First " или " Last" или " " по-прежнему не являются желаемым результатом, так что это можно было бы изучить ;-)   -  person    schedule 24.07.2012


Ответы (3)


Из-за относительного приоритета ?? и + операторы. Попробуй это:

string SpeakerName = (name.First ?? "") + " " + (name.Last ?? "");

Ваш исходный пример оценивается так, как если бы это было:

string SpeakerName = name.First ?? ("" + " "  +  (name.Last ?? ""));

Кроме того, прочитайте ответ Джона здесь: Каков приоритет оператора C# объединения нулей (??)?

Как он предлагает там, это тоже должно работать:

string SpeakerName = name.First + " " + name.Last;

Поскольку это компилируется в ответ @LB ниже, за вычетом обрезки:

string SpeakerName = String.Format("{0} {1}", name.First, name.Last)

РЕДАКТИРОВАТЬ:

Вы также спросили, что первое и последнее оба == null делают результат пустой строкой. Как правило, это решается вызовом .Trim() для результата, но это не совсем эквивалентно. Например, по какой-то причине вам может понадобиться захотеть начальные или конечные пробелы, если имена не пустые, например. «Фред» + «Астер» => «Фред Астер». Мы все предполагали, что вы захотите обрезать их. Если вы этого не сделаете, я бы предложил использовать условное выражение:

string SpeakerName = name.First + " " + name.Last;
SpeakerName = SpeakerName == " " ? String.Empty : SpeakerName;

Если вам никогда не нужны начальные или конечные пробелы, просто добавьте .Trim() как @L.B. делал

person Chris Shain    schedule 24.07.2012

string fullName = (name.First + " "  +  name.Last).Trim();

Это работает для одного или обоих значений null и не возвращает строку с начальными, конечными или только пробелами.

person Tergiver    schedule 24.07.2012

person    schedule
comment
+1 за чтение и понимание ... так что, если null, по умолчанию используется пустая строка для имени или фамилии ... так же, как я - person Les; 24.07.2012