Кратчайший способ проверить наличие нуля и присвоить другое значение, если нет


86

Я извлекаю varcharзначения из БД и хочу установить для stringприсваиваемых им значений "", если они есть null. Сейчас я делаю это так:

if (string.IsNullOrEmpty(planRec.approved_by) == true)
  this.approved_by = "";
else
  this.approved_by = planRec.approved_by.toString();

Кажется, должен быть способ сделать это в одной строке, например:

this.approved_by = "" || planRec.approved_by.toString();

Однако я не могу найти оптимального способа сделать это. Есть ли способ лучше или я могу это сделать лучше всего?


5
== true здесь излишни ...
cjk

Ответы:


104

Попробуй это:

this.approved_by = IsNullOrEmpty(planRec.approved_by) ? "" : planRec.approved_by.toString();

Вы также можете использовать оператор объединения с нулем, как говорили другие, поскольку никто не привел пример, который работает с вашим кодом, вот один:

this.approved_by = planRec.approved_by ?? planRec.approved_by.toString();

Но этот пример работает только потому, что возможное значение this.approved_byсовпадает с одним из потенциальных значений, которые вы хотите установить. Во всех остальных случаях вам нужно будет использовать условный оператор, как я показал в моем первом примере.


8
Разве этот оператор объединения с нулевым значением все равно не генерирует нулевую ссылку? Как я вижу этот код делает следующее: if (planRec.approved_by == null) { this.approved_by = planRec.approved_by.toString(); //<= nullref } else { this.approved_by = planRec.approved_by;}. Если я не прав, укажите на ошибку.
Destrictor

10
@Destrictor прав, код не работает. Вот исправление с использованием другого забавного оператора: this.approved_by = planRec.approved_by?.toString() ?? ""; <- Это оператор с нулевым условием, и я не думаю, что он был когда-то, когда этот вопрос был впервые задан и дан ответ. Надеюсь, OP это видит, поэтому он может провести рефакторинг своего 7-летнего кода, написанного двумя работами назад :).
Патрик


30

Вы ищете оператор объединения C #: ??. Этот оператор принимает левый и правый аргумент. Если левая часть оператора имеет значение null или обнуляемое значение без значения, он вернет правый аргумент. В противном случае вернет левую.

var x = somePossiblyNullValue ?? valueIfNull;

Этот ответ не охватывает все случаи из вопроса (только частично). Обратите внимание, что есть "string.IsNullOrEmpty". Таким образом, пустой случай здесь не обрабатывается.
Бронек

28

Думаю, лучшее, что вы можете придумать, это

this.approved_by = IsNullOrEmpty(planRec.approved_by) ? string.Empty
                                                      : planRec.approved_by.ToString();

Конечно, поскольку вы намекаете на то, что approved_byэто object(что не может равняться ""), это будет переписано как

this.approved_by = (planRec.approved_by ?? string.Empty).ToString();

20

В C # 6 есть несколько более короткий способ для случая, когда planRec.approved_by не является строкой:

this.approved_by = planRec.approved_by?.ToString() ?? "";

15

Используйте оператор объединения C #: ??

// if Value is not null, newValue = Value else if Value is null newValue is YournullValue
var newValue = Value ?? YourNullReplacement;

15

Начиная с C # 8.0, вы можете использовать оператор ?? = для замены кода формы

if (variable is null)
{
    variable = expression;
}

со следующим кодом:

variable ??= expression;

Более подробная информация здесь



2

Чтобы назначить непустую переменную без повторения фактического имени переменной (и без присвоения чего-либо, если переменная равна нулю!), Вы можете использовать небольшой вспомогательный метод с Actionпараметром:

public static void CallIfNonEmpty(string value, Action<string> action)
{
    if (!string.IsNullOrEmpty(value))
        action(value);
}

А потом просто используйте:

CallIfNonEmpty(this.approved_by, (s) => planRec.approved_by = s);


-4

Я использую метод расширения SelfChk

static class MyExt {
//Self Check 
 public static void SC(this string you,ref string me)
    {
        me = me ?? you;
    }
}

Затем используйте как

string a = null;
"A".SC(ref a);

Я думаю, вы имеете в виду, но не легко читать и понимать, не так ли?
Али Хумаюн

3
UPS! Вы абсолютно правы: очень короткие, но НЕ легкие для чтения и понимания (по крайней мере, если вы не привыкли к этим обозначениям)
Джек Миллер

в таком случае попробуйте почитать книгу. Вы найдете это действительно подробным и простым для понимания: p
Али Хумаюн
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.