检查 null 并在没有时分配另一个值的最短方法

Posted

技术标签:

【中文标题】检查 null 并在没有时分配另一个值的最短方法【英文标题】:Shortest way to check for null and assign another value if not 【发布时间】:2010-11-10 08:54:09 【问题描述】:

我正在从数据库中提取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();

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

【问题讨论】:

这里的 == true 是多余的...... 【参考方案1】:

试试这个:

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 的可能值与您希望将其设置为的潜在值之一相同。对于所有其他情况,您将需要使用我在第一个示例中展示的条件运算符。

【讨论】:

这个空合并操作符不会抛出空引用吗?我看到这段代码的方式如下:if (planRec.approved_by == null) this.approved_by = planRec.approved_by.toString(); //<= nullref else this.approved_by = planRec.approved_by;。如果我错了,请指出错误。 @Destrictor 是对的,代码被破坏了。这是使用另一个有趣的运算符进行的修复:this.approved_by = planRec.approved_by?.toString() ?? ""; 我可以发誓我见过某种语法,如果该对象不为空,您可以将其分配给该对象的属性,例如 someObject?.someAttribute = value;但我似乎找不到类似的东西。【参考方案2】:

coalesce operator (??) 是你想要的,我相信。

【讨论】:

是的......但只是因为默认是“”。 嗯,怎么样?可以使用任何表达式将 null 替换为..【参考方案3】:

您正在寻找 C# 合并运算符:??。此运算符接受左右参数。如果运算符的左侧为 null 或可为 null 且没有值,它将返回右侧参数。否则它将返回左侧。

var x = somePossiblyNullValue ?? valueIfNull;

【讨论】:

此答案并未涵盖问题的所有情况(仅部分)。请注意,有“string.IsNullOrEmpty”。所以这里不处理空箱。 赞成,因为这是我正在寻找的答案。 (我只需要空检查)【参考方案4】:

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

if (variable is null)

    variable = expression;

使用以下代码:

variable ??= expression;

更多信息是here

【讨论】:

这个有VB.net版本吗?【参考方案5】:

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

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

当然,既然您暗示approved_byobject(不能等于“”),这将被重写为

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

【讨论】:

【参考方案6】:

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

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

【讨论】:

【参考方案7】:

使用 C# 合并运算符:??

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

【讨论】:

【参考方案8】:

扩展@Dave's answer...如果planRec.approved_by 已经是一个字符串

this.approved_by = planRec.approved_by ?? "";

【讨论】:

我不知道为什么这个答案是第 8 多票:/【参考方案9】:

要在不重复实际变量名称的情况下分配非空变量(如果变量为 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);

【讨论】:

【参考方案10】:

您也可以在查询中执行此操作,例如在 sql server、google ISNULLCASE 内置函数中。

【讨论】:

【参考方案11】:

接受的答案在给出的时候是正确的。

对于仍在寻找这个问题的人: 今天你可以使用 ??= 运算符。

例如:

private string _test = null;

private void InitIfNull()
 _test ??= "Init";

【讨论】:

【参考方案12】:

我使用扩展方法SelfChk

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

然后用like

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

【讨论】:

我猜你的意思是但不容易阅读和理解,是这样吗? 起来!你是绝对正确的:很短,但不容易阅读和理解(至少如果你不习惯这种符号) 那么在这种情况下尝试阅读一本书。您会发现它非常详尽且易于理解:p

以上是关于检查 null 并在没有时分配另一个值的最短方法的主要内容,如果未能解决你的问题,请参考以下文章

为变量分配默认值的最短方法?

用布尔值(PHP)评估数组的最短方法?

使用PHP检查变量是不是包含正整数的最短方法?

如果不为空,检查查询字符串参数值的最优雅方法是啥?

查询与 Hive QL 中另一列中的每个值关联的最短字符串值的更有效方法

检查 TypeScript 数字上的 null 和空字符串的最简单方法