What is the “??” operator for?
我在想关于
那
?? Null Coalescing Operator —> What does coalescing mean?
它是空合并运算符。它是在C 2中引入的。
如果不为空,则表达式
两件好事:
表达式的整体类型是第二个操作数的类型,这在使用可为空的值类型时很重要:
1
2int? maybe = ...;
int definitely = maybe ?? 10;(请注意,不能将不可为空的值类型用作第一个操作数-它将是毫无意义的。)
关联性规则意味着您可以很容易地将其链接起来。例如:
1string address = shippingAddress ?? billingAddress ?? contactAddress;
这将使用发货地址、帐单地址或联系人地址中的第一个非空值。
它被称为"空合并运算符",工作原理如下:
而不是:
1 2 | int? number = null; int result = number == null ? 0 : number; |
你现在可以做:
1 | int result = number ?? 0; |
这是合并运算符。它本质上是以下内容的简写
有关操作员的msdn文档
- http://msdn.microsoft.com/en-us/library/ms173224.aspx
这是一个快捷方式:
1 | Text = (category == null ?"Home" : category); |
这是新的空合并运算符。
这个??如果左操作数不为空,则返回左操作数,否则返回右操作数。
您可以在这里阅读:http://msdn.microsoft.com/en-us/library/ms173224(vs.80).aspx
它是凝聚运算符。如果第一个值为空,则返回另一个值
1 2 3 4 | string value1 = null; string value2 ="other"; string value3 = value1 ?? value2; // assigns"other" to value 3 |
它检查类别是否为空-在这种情况下,空值将替换为"home"。
如果类别为空,文本将变为"主页"
我最喜欢使用的一个空合并操作符是避免代码中的if语句(我认为if语句很难看,而且大多数时候都会把事情搞得乱七八糟)。例如,在一个典型的场景中,如果可用,可以选择从缓存加载某些内容,否则从数据库加载并填充缓存。
1 2 3 4 5 6 7 8 9 10 | private SomeData GetData() { var data = HttpRuntime.Cache.Get("key") as SomeData; if (data == null) { data = DAL.GetData(some parameters...); HttpRuntime.Cache.Add("key", data, ....); } return data; } |
对我来说,这是一个丑陋的准则。我可能有点不太明白,但为什么不改为重构它呢?
1 2 3 4 5 6 7 8 9 10 | private SomeData GetDataAndCache() { var data = DAL.GetData(some parameters...); HttpRuntime.Cache.Add("key", data, ....); return data; } private SomeData GetData() { var data = HttpRuntime.Cache.Get("key") as SomeData; return data ?? GetDataAndCache(); } |
它更接近SRP,更清洁,更容易阅读,IMO。功能执行一个明确可识别的功能。
返回第一个非空值。手巧。
??空合并运算符
int?是一个可以为空的int,这意味着它可以有一个正常int和null的值。阅读此了解详细信息。
这是空合并运算符。它与可以为空的类型一起使用(除其他之外,抱歉:)