问号和点运算符是什么?在 C# 6.0 中是什么意思?
What does question mark and dot operator ?. mean in C# 6.0?
在 VS2015 预览版中使用 C# 6.0 我们有一个新的运算符,?.
,可以像这样使用:
public class A {
string PropertyOfA { get; set; }
}
...
var a = new A();
var foo = "bar";
if(a?.PropertyOfA != foo) {
//somecode
}
它到底有什么作用?
这是 null conditional 运算符。它基本上意味着:
"Evaluate the first operand; if that's null, stop, with a result of null. Otherwise, evaluate the second operand (as a member access of the first operand)."
在你的例子中,重点是如果 a
是 null
,那么 a?.PropertyOfA
将评估为 null
而不是抛出异常 - 然后它会比较null
与 foo
的引用(使用字符串的 ==
重载),发现它们不相等,执行将进入 if
语句的主体。
也就是说,是这样的:
string bar = (a == null ? null : a.PropertyOfA);
if (bar != foo)
{
...
}
... 除了 a
只计算一次。
请注意,这也可以更改表达式的类型。例如,考虑 FileInfo.Length
。这是 long
类型的 属性,但如果将它与 null 条件运算符一起使用,最终会得到类型 long?
:
的表达式
FileInfo fi = ...; // fi could be null
long? length = fi?.Length; // If fi is null, length will be null
在展平层次结构 and/or 映射对象时非常有用。而不是:
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";
DotNetFiddle.Net Working Example.
(?? or null-coalescing operator is different than the ? or null conditional operator).
它也可以在 Action 的赋值运算符之外使用。而不是
Action<TValue> myAction = null;
if (myAction != null)
{
myAction(TValue);
}
可以简化为:
myAction?.Invoke(TValue);
使用系统;
public class Program
{
public static void Main()
{
Action<string> consoleWrite = null;
consoleWrite?.Invoke("Test 1");
consoleWrite = (s) => Console.WriteLine(s);
consoleWrite?.Invoke("Test 2");
}
}
结果:
Test 2
Basically, I have applied ?. operator after Model as well. I am trying to know that whether it can be applied directly to the model or does it only work with the navigation properties?
左边值的? or null conditional operator运算符,不管值的类型。并且编译器不关心右边的值是什么。它是简单的编译器 magic(这意味着它可以做一些您已经可以做的事情,只是在一个简化的原因中)。
例如
var a = model?.Value;
等于说
var a = model == null ? null : model.Value;
在第二种情况下,检查 null 的评估与值 returned 没有关联。 null 条件运算符 基本上总是 return null 如果左边的值为 null。
成员类型(方法、字段、属性、构造函数).Value
无关。
您的 DotNetFiddle 示例不起作用的原因是用于 .Net 4.7.2
的编译器与支持 null 条件运算符的 c# 版本不兼容。将其更改为 .Net 5,有效:
这对于 C# 来说是相对较新的,它使我们可以很容易地在方法链中调用关于 null 或非 null 值的函数。
实现相同目标的旧方法是:
var functionCaller = this.member;
if (functionCaller!= null)
functionCaller.someFunction(var someParam);
现在只需:
member?.someFunction(var someParam);
强烈推荐this doc page。
在 VS2015 预览版中使用 C# 6.0 我们有一个新的运算符,?.
,可以像这样使用:
public class A {
string PropertyOfA { get; set; }
}
...
var a = new A();
var foo = "bar";
if(a?.PropertyOfA != foo) {
//somecode
}
它到底有什么作用?
这是 null conditional 运算符。它基本上意味着:
"Evaluate the first operand; if that's null, stop, with a result of null. Otherwise, evaluate the second operand (as a member access of the first operand)."
在你的例子中,重点是如果 a
是 null
,那么 a?.PropertyOfA
将评估为 null
而不是抛出异常 - 然后它会比较null
与 foo
的引用(使用字符串的 ==
重载),发现它们不相等,执行将进入 if
语句的主体。
也就是说,是这样的:
string bar = (a == null ? null : a.PropertyOfA);
if (bar != foo)
{
...
}
... 除了 a
只计算一次。
请注意,这也可以更改表达式的类型。例如,考虑 FileInfo.Length
。这是 long
类型的 属性,但如果将它与 null 条件运算符一起使用,最终会得到类型 long?
:
FileInfo fi = ...; // fi could be null
long? length = fi?.Length; // If fi is null, length will be null
在展平层次结构 and/or 映射对象时非常有用。而不是:
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";
DotNetFiddle.Net Working Example.
(?? or null-coalescing operator is different than the ? or null conditional operator).
它也可以在 Action 的赋值运算符之外使用。而不是
Action<TValue> myAction = null;
if (myAction != null)
{
myAction(TValue);
}
可以简化为:
myAction?.Invoke(TValue);
使用系统;
public class Program
{
public static void Main()
{
Action<string> consoleWrite = null;
consoleWrite?.Invoke("Test 1");
consoleWrite = (s) => Console.WriteLine(s);
consoleWrite?.Invoke("Test 2");
}
}
结果:
Test 2
Basically, I have applied ?. operator after Model as well. I am trying to know that whether it can be applied directly to the model or does it only work with the navigation properties?
左边值的? or null conditional operator运算符,不管值的类型。并且编译器不关心右边的值是什么。它是简单的编译器 magic(这意味着它可以做一些您已经可以做的事情,只是在一个简化的原因中)。
例如
var a = model?.Value;
等于说
var a = model == null ? null : model.Value;
在第二种情况下,检查 null 的评估与值 returned 没有关联。 null 条件运算符 基本上总是 return null 如果左边的值为 null。
成员类型(方法、字段、属性、构造函数).Value
无关。
您的 DotNetFiddle 示例不起作用的原因是用于 .Net 4.7.2
的编译器与支持 null 条件运算符的 c# 版本不兼容。将其更改为 .Net 5,有效:
这对于 C# 来说是相对较新的,它使我们可以很容易地在方法链中调用关于 null 或非 null 值的函数。
实现相同目标的旧方法是:
var functionCaller = this.member;
if (functionCaller!= null)
functionCaller.someFunction(var someParam);
现在只需:
member?.someFunction(var someParam);
强烈推荐this doc page。