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


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.