我们在VS2015预览版中拥有了新的运算符?.
,可以像这样使用:
public class A {
string PropertyOfA { get; set; }
}
...
var a = new A();
var foo = "bar";
if(a?.PropertyOfA != foo) {
//somecode
}
它究竟是做什么的?
这是 null条件 运算符。它的意思是:
"评估第一个操作数;如果为 null,则停止,并得到一个 null 结果。否则,将第二个操作数作为第一个操作数的成员进行评估。"
在您的示例中,重点是如果 a
是 null
,那么 a?.PropertyOfA
将会评估为 null
而不是抛出异常。然后它将使用字符串的 ==
重载比较该 null
引用与 foo
,发现它们不相等,执行将进入 if
语句体。
换句话说,就像这样:
string bar = (a == null ? null : a.PropertyOfA);
if (bar != foo)
{
...
}
……除了a
只被评估一次之外。
要注意这可能会改变表达式的类型。例如,考虑FileInfo.Length
。那是一个long
类型的属性,但如果你使用空值条件运算符,你最终得到的是一个long?
类型的表达式:
FileInfo fi = ...; // fi could be null
long? length = fi?.Length; // If fi is null, length will be null
string.Join(",", potentiallyNull ?? "")
,并且 potentiallyNull
为 null,那么 string.Join
返回一个空字符串。这不是你想要的吗? - Gabriel当需要展平层次结构或映射对象时,这将非常有用。不要:
if (Model.Model2 == null
|| Model.Model2.Model3 == null
|| Model.Model2.Model3.Model4 == null
|| Model.Model2.Model3.Model4.Name == null)
{
mapped.Name = "N/A"
}
else
{
mapped.Name = Model.Model2.Model3.Model4.Name;
}
它可以像上面那样编写(与上面相同的逻辑)
mapped.Name = Model.Model2?.Model3?.Model4?.Name ?? "N/A";
(??或null合并运算符与?或null条件运算符不同)。
它也可以在Action中的赋值运算符之外使用。而不是
Action<TValue> myAction = null;
if (myAction != null)
{
myAction(TValue);
}
可以简化为:
myAction?.Invoke(TValue);
using System;
public class Program
{
public static void Main()
{
Action<string> consoleWrite = null;
consoleWrite?.Invoke("Test 1");
consoleWrite = (s) => Console.WriteLine(s);
consoleWrite?.Invoke("Test 2");
}
}
结果:
测试2
基本上,我在 Model 后面应用了 ?. 运算符。我想知道它是否可以直接应用于模型,还是只能与导航属性一起使用?
? 或 null 条件运算符 对左值进行操作,不管其类型如何。编译器不关心右侧的值是什么。这是简单的编译器 魔法(意味着它做了你已经可以做的事情,只是以简化的方式)。
例如
var a = model?.Value;
var a = model == null ? null : model.Value;
.Value
是不相关的。.Net 4.7.2
不兼容支持空条件运算符的 c# 版本。将其更改为 .Net 5 即可解决:
|| Model.Model2.Model3.Model4.Name == null
来保持相同的逻辑,否则如果 Model.Model2.Model3.Model4.Name
为 null
,mapped.Name
将保持为 null
。 - RazvanRelse
分支,并且 mapped.Name = Model.Model2.Model3.Model4.Name -> mapped.Name = null
,而您的第二个示例将替换为 mapped.Name = "N/A"
。请参见编辑后的DotNetFiddle。 - derMvar functionCaller = this.member;
if (functionCaller!= null)
functionCaller.someFunction(var someParam);
member?.someFunction(var someParam);
我强烈推荐这个文档页面。
var user = db.Users.Where(m=>m.id == id).FirstOrDefault(); Console.WriteLine(user?.id);
这样行吗,还是 ?.
只能用于导航属性?请检查这个 fiddle: https://dotnetfiddle.net/2BblBv - Junaid
bool?
转换为bool
值,请访问以下链接:https://dev59.com/gG025IYBdhLWcg3wVkUR - Mauricio Gracia Gutierrez