检查null并分配另一个值的最短方法


80

我正在将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

Answers:


101

试试这个:

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

您还可以使用其他人所说的null-coalescing运算符-因为没有人提供与您的代码一起使用的示例,所以这里是一个:

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或无值的可为null,它将返回右侧参数。否则它将返回左边。

var x = somePossiblyNullValue ?? valueIfNull;

此答案未涵盖问题中的所有情况(仅部分涵盖)。请注意,这里有“ string.IsNullOrEmpty”。因此,此处不处理空箱。
Bronek

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();

19

在C#6中,对于planRec.approved_by不是字符串的情况,有一种略短的方法:

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


13

从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 server,googleISNULLCASE内置函数中。


-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!您绝对正确:非常简短,但不容易阅读和理解(至少在您不习惯这种表示法的情况下)
Jack Miller

那么在这种情况下,请尝试读书。您会发现它确实很详尽且易于理解:p
Ali Humayun
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.