检查 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_by
是object
(不能等于“”),这将被重写为
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 ISNULL
和 CASE
内置函数中。
【讨论】:
【参考方案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 并在没有时分配另一个值的最短方法的主要内容,如果未能解决你的问题,请参考以下文章