Найкоротший спосіб перевірити на нуль і присвоїти інше значення, якщо ні


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
Тут істина == зайва ...
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 #: ??. Цей оператор бере аргумент ліворуч та праворуч. Якщо ліва частина оператора є нульовою або має нульовий значення без значення, він поверне правий аргумент. Інакше поверне ліворуч.

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

Щоб призначити непусту змінну без повторення фактичного імені змінної (і не призначаючи нічого, якщо змінна має значення null!), Ви можете використовувати маленький допоміжний метод із 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);

1

Ви також можете зробити це у своєму запиті, наприклад, на сервері sql, google ISNULLта CASEвбудованих функціях.


-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
Добре! Ви абсолютно праві: Дуже короткий, але НЕ легкий для читання та розуміння (принаймні, якщо ви не звикли до цього позначення)
Джек Міллер,

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