检查null的最短方法,如果没有,则分配另一个值

Spl*_*lin 67 .net c# null variable-assignment

我正在varchar从数据库中提取值,并希望设置string我将它们分配为"",如果它们是null.我现在这样做:

if (string.IsNullOrEmpty(planRec.approved_by) == true)
  this.approved_by = "";
else
  this.approved_by = planRec.approved_by.toString();
Run Code Online (Sandbox Code Playgroud)

似乎应该有一种方法可以在一行中执行以下操作:

this.approved_by = "" || planRec.approved_by.toString();
Run Code Online (Sandbox Code Playgroud)

但是我找不到最佳方法来做到这一点.有更好的方法还是我最好的方法呢?

And*_*are 88

试试这个:

this.approved_by = IsNullOrEmpty(planRec.approved_by) ? "" : planRec.approved_by.toString();
Run Code Online (Sandbox Code Playgroud)

您也可以像其他人所说的那样使用null-coalescing运算符 - 因为没有人给出一个与您的代码一起使用的示例,其中一个:

this.approved_by = planRec.approved_by ?? planRec.approved_by.toString();
Run Code Online (Sandbox Code Playgroud)

但此示例仅起作用,因为可能的值this.approved_by与您希望将其设置为的潜在值之一相同.对于所有其他情况,您将需要使用我在第一个示例中显示的条件运算符.

  • 这个null合并运算符不会抛出null引用吗?我看到这段代码的方式如下:`if(planRec.approved_by == null){this.approved_by = planRec.approved_by.toString(); // <= nullref} else {this.approved_by = planRec.approved_by;}`.如果我错了,请指出错误. (8认同)
  • @Destrictor是对的,代码坏了.这是使用另一个有趣的运算符修复:`this.approved_by = planRec.approved_by?.toString()?? "";`< - 这是空条件运算符,我不认为它是在第一次被问及回答这个问题时出现的.希望OP看到这一点,所以他可以从两个工作前重构他的7岁代码:). (8认同)

Dav*_*ard 30

COALESCE操作符(??)是你想要的,我相信.

  • 是的......但只是因为默认值为"". (3认同)
  • 嗯,怎么会这样呢?可以使用任何表达式将 null 替换为.. (2认同)

nzr*_*tmn 27

从 C# 8.0 开始,您可以使用 ??= 运算符来替换表单的代码

if (variable is null)
{
    variable = expression;
}
Run Code Online (Sandbox Code Playgroud)

使用以下代码:

variable ??= expression;
Run Code Online (Sandbox Code Playgroud)

更多信息在这里

  • 如果您也可以通过条件访问来扩展它,那就太棒了,例如variable1.variable2?.variable3 ??= value; (3认同)

Dmi*_*ruk 25

我的猜测是你能想到的最好的

this.approved_by = IsNullOrEmpty(planRec.approved_by) ? string.Empty
                                                      : planRec.approved_by.ToString();
Run Code Online (Sandbox Code Playgroud)

当然,因为你暗示的approved_by是一个object(不能等于"")的事实,这将被重写为

this.approved_by = (planRec.approved_by ?? string.Empty).ToString();
Run Code Online (Sandbox Code Playgroud)


Jar*_*Par 24

您正在寻找C#coalesce运算符:??.该运算符采用左右参数.如果运算符的左侧为null或可为空且没有值,则它将返回正确的参数.否则它将返回左侧.

var x = somePossiblyNullValue ?? valueIfNull;
Run Code Online (Sandbox Code Playgroud)

  • 赞成,因为这就是我正在寻找的答案。(我只需要空检查) (2认同)

Mal*_*olm 16

对于C#6,planRec.approved_by不是字符串的情况稍微短一些:

this.approved_by = planRec.approved_by?.ToString() ?? "";
Run Code Online (Sandbox Code Playgroud)


Ram*_*rja 13

使用C#coalesce运算符:??

// if Value is not null, newValue = Value else if Value is null newValue is YournullValue
var newValue = Value ?? YourNullReplacement;
Run Code Online (Sandbox Code Playgroud)


Pau*_*der 9

扩展@Dave 的答案 ...如果planRec.approved_by已经是一个字符串

this.approved_by = planRec.approved_by ?? "";
Run Code Online (Sandbox Code Playgroud)