C#中两个问号共赞成味着什么?

跨越这行代码: 数据结构

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

这两个问号意味着什么,是某种三元运算符? 谷歌很难找到。 app


#1楼

若是你熟悉Ruby,它的||=彷佛相似于C#的?? 对我来讲。 这是一些Ruby: ide

irb(main):001:0> str1 = nil
=> nil
irb(main):002:0> str1 ||= "new value"
=> "new value"
irb(main):003:0> str2 = "old value"
=> "old value"
irb(main):004:0> str2 ||= "another new value"
=> "old value"
irb(main):005:0> str1
=> "new value"
irb(main):006:0> str2
=> "old value"

在C#中: 测试

string str1 = null;
str1 = str1 ?? "new value";
string str2 = "old value";
str2 = str2 ?? "another new value";

#2楼

这没什么危险的。 事实上,它是美丽的。 若是须要,您能够添加默认值,例如: spa

code

int x = x1 ?? x2 ?? x3 ?? x4 ?? 0;

#3楼

在此输入图像描述

两个问号(??)表示它是一个Coalescing运算符。 orm

Coalescing运算符返回链中的第一个NON-NULL值。 你能够看到这个youtube视频 ,它实际上展现了整个事物。 视频

可是,让我为视频所说的内容添加更多内容。 对象

若是你看到合并的英文含义,就说“合并在一块儿”。 例如,下面是一个简单的合并代码,它连接了四个字符串。 索引

所以,若是str1null ,它将尝试str2 ,若是str2null ,它将尝试str3 ,依此类推,直到找到具备非null值的字符串。

string final = str1 ?? str2 ?? str3 ?? str4;

简单来讲,Coalescing运算符从链中返回第一个NON-NULL值。


#4楼

这里使用合并获取值的一些示例是低效的。

你真正想要的是:

return _formsAuthWrapper = _formsAuthWrapper ?? new FormsAuthenticationWrapper();

要么

return _formsAuthWrapper ?? (_formsAuthWrapper = new FormsAuthenticationWrapper());

这能够防止每次都从新建立对象。 而不是私有变量保持为null而且在每一个请求上建立新对象,这确保在建立新对象时分配私有变量。


#5楼

正如许多答案中正确指出的那样是“空合并运算符”( ?? ),说到你也可能想要查看它的表兄“Null-conditional Operator”( ?。?[ ),它是一个运算符不少次它与??一块儿使用

空条件运算符

用于在执行成员访问( ?。 )或索引( ?[ )操做以前测试null。 这些运算符可帮助您编写更少的代码来处理空值检查,尤为是降序到数据结构中。

例如:

// if 'customers' or 'Order' property or 'Price' property  is null,
// dollarAmount will be 0 
// otherwise dollarAmount will be equal to 'customers.Order.Price'

int dollarAmount = customers?.Order?.Price ?? 0;

旧的方式没有?? 作到这一点

int dollarAmount = customers != null 
                   && customers.Order!=null
                   && customers.Order.Price!=null 
                    ? customers.Order.Price : 0;

这更冗长,更麻烦。

相关文章
相关标签/搜索