跨越这行代码: 数据结构
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
这两个问号意味着什么,是某种三元运算符? 谷歌很难找到。 app
若是你熟悉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";
这没什么危险的。 事实上,它是美丽的。 若是须要,您能够添加默认值,例如: spa
码 code
int x = x1 ?? x2 ?? x3 ?? x4 ?? 0;
两个问号(??)表示它是一个Coalescing运算符。 orm
Coalescing运算符返回链中的第一个NON-NULL值。 你能够看到这个youtube视频 ,它实际上展现了整个事物。 视频
可是,让我为视频所说的内容添加更多内容。 对象
若是你看到合并的英文含义,就说“合并在一块儿”。 例如,下面是一个简单的合并代码,它连接了四个字符串。 索引
所以,若是str1
为null
,它将尝试str2
,若是str2
为null
,它将尝试str3
,依此类推,直到找到具备非null值的字符串。
string final = str1 ?? str2 ?? str3 ?? str4;
简单来讲,Coalescing运算符从链中返回第一个NON-NULL值。
这里使用合并获取值的一些示例是低效的。
你真正想要的是:
return _formsAuthWrapper = _formsAuthWrapper ?? new FormsAuthenticationWrapper();
要么
return _formsAuthWrapper ?? (_formsAuthWrapper = new FormsAuthenticationWrapper());
这能够防止每次都从新建立对象。 而不是私有变量保持为null而且在每一个请求上建立新对象,这确保在建立新对象时分配私有变量。
正如许多答案中正确指出的那样是“空合并运算符”( ?? ),说到你也可能想要查看它的表兄“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;
这更冗长,更麻烦。