What does question mark and dot operator ?. mean in C# 6.0?
在VS2015预览版中有了C 6.0,我们有了一个新的运营商,?.,可以这样使用:
1 2 3 4 5 6 7 8 9 10 11
| public class A {
string PropertyOfA { get; set; }
}
...
var a = new A ();
var foo ="bar";
if(a ?.PropertyOfA != foo ) {
//somecode
} |
它到底是做什么的?
这是"零条件的经营者。它基本上意味着:P></
"the第一操作数评价;如果是空,空切,用result of。其他评价,第二操作数(as of the first成员访问操作符)。"P></
在你的example,the Point is that if ais to null,然后将评价a?.PropertyOfAnullRather比将安恩会出现例外,那么,nullfoo(S与参考使用string' ==overload),发现他们不平等和Will Go into the执行体是ifof the清单。P></
在其他的话,它是这样的:P></
1 2 3 4 5
| string bar = (a == null ? null : a.PropertyOfA);
if (bar != foo)
{
...
} |
……除了athat is only evaluated盎司。P></
that this can change the笔记type of the expression,太。FileInfo.Lengthfor example,考虑。这是在longproperty of type,but with the null如果你使用它的条件的经营者,你端上安有:long?expression of typeP></
1 2
| FileInfo fi = ...; // fi could be null
long? length = fi?.Length; // If fi is null, length will be null |
- 它不是称为空条件运算符吗?
- @斯拉克斯:我以为这是"条件无效",但我可能错了。上次我检查Roslyn语言功能文档时,它也没有被重命名为。也许源头是这里的权威-会查到的。
- "条件空"使它听起来像是一种空值,而事实并非如此。
- 拉斯克:当然。在syntaxkind中,显然是条件访问表达式,这两个表达式都不是令人讨厌的…
- @斯莱克斯:问过皮尔奇:)
- 如果OP的示例if(a ?. PropertyOfA != foo)是有效的,那么您的回答意味着if(null)也是有效的。它是,如果是,它对true还是false进行评估?
- @500 InternalServerError:不,只有a?.PropertyOfA的计算结果为空-我会澄清的。
- 我更喜欢"猫王"这个名字。接线员:P。
- @斯拉克斯:是的,我有话要说回来——这是空条件。修正了答案。
- 就记录而言,我看到了这个运算符的五个不同名称:安全导航、空条件、空传播、条件访问、ELVIS。
- 即使在最高的警告级别上,如果警告为错误,Microsoft编译器也会允许使用"不安全"代码。另一方面,mono将抛出错误并调用显式转换。这只是一个提示,让每个人都能用mono-on代码编写CS0019,而mono-on代码可以用.net编译。
- @ M?Nxomaτ:你在说什么"不安全"的代码?
- @乔恩斯基特并不是真正的不安全者(因此是引言者)。这是关于你关于突然改变类型的笔记。单用户在构建包含?.的代码时,经常会遇到错误消息,如Cannot implicitly convert type 'bool?' to 'bool'.。NET编译器不会生成此类错误(这不是问题)。
- @斯莱克斯和乔恩,这是埃多克斯1〔7〕和埃多克斯1〔9〕一样吗?我在找.?,结果到了这里
- @第一步:.?不是有效的运算符。
- 哦,对不起,我的错。谢谢
- 旧的问题,但这并不保证它本身:有没有一种方法可以将它用于像string.Join(",", potentiallyNull)这样的情况,或者我应该坚持使用三元运算符?
- @辛贾伊也许是埃多克西(13)
- @加布里埃尔是的,但如果不是空的呢?然后我想做string.Join()函数。我看不出三元的方法,我只是想知道是否有比我更聪明的人知道某种魔法。
- 如果执行string.Join(",", potentiallyNull ??""),并且potentiallyNull为空,则string.Join返回空字符串。这不是你想要的吗?
- 我认为"安全评估"最适合描述这个操作者。它确保您不评估空对象的属性或方法,因为这样会得到所有这些讨厌的错误。坏的是,"它隐藏"了对象为什么为空的问题,因为大多数情况下它并不打算为空。所以在使用时要牢记这一点。
- @Hermanvanderblom:一个对象从不会是空的…我很乐意"空安全取消引用",但"安全评估"对我来说有点太宽泛了。不过,我认为最好还是坚持使用语言规范术语:空条件运算符。
- 表达式对象?.x是安全的,因为它不会引发错误,因为对象没有值。如果对象为空,则表示该对象已声明,但没有值。
- @Hermanvanderblom:同样,这个术语是不正确的——它是声明的变量,变量的值为空。但考虑一下x?.Foo(10)——这是"安全评估"吗?当然,如果x为空,它不会立即抛出空引用异常,但它仍然可以很容易地抛出异常。它甚至可以在Foo中抛出nullreferenceexception。只有对x的解引用才是空安全的,因此我建议的术语如果你真的,真的不想使用C小组决定的。
- 好吧,就我的目的而言,我认为整个表达式是"安全评估",我只知道x?角色在其中起作用。"安全"是因为它是在运行时完成的。foo(10)部分对我来说并不有趣,因为我已经确保它在编译时有效。
- @赫尔曼凡德罗姆:我想我们必须同意不同意。我绝对不认为"安全评估"和"空安全解引用"或"空条件运算符"一样清晰和精确。
- 它只是将字段/属性访问或方法调用作为函数绑定到其左侧参数的语法糖,将其解释为一类内函数中的一个单体。
它可以非常有用,当flattening层和/或映射到对象。:instead ofP></
1 2 3 4 5 6 7 8 9 10 11
| 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;
} |
恩好(can be same as above逻辑类)P></
1
| mapped.Name = Model.Model2?.Model3?.Model4?.Name ??"N/A"; |
dotnetfiddle .NET工作实例。P></
(the?coalescing社零?或是不同的比?零条件或经营者)。P></
它也可以使用端配置好了学院与经营者的行动。instead ofP></
1 2 3 4 5 6
| Action<TValue> myAction = null;
if (myAction != null)
{
myAction(TValue);
} |
恩:simplified can be toP></
1
| myAction?.Invoke(TValue); |
dotnetfiddle实例:P></
利用系统;P></
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class Program
{
public static void Main()
{
Action<string> consoleWrite = null;
consoleWrite?.Invoke("Test 1");
consoleWrite = (s) => Console.WriteLine(s);
consoleWrite?.Invoke("Test 2");
}
} |
结果:P></
Test 2
- 为了拯救人们寻找什么?是…它是空合并运算符,如果不为空则返回名称,否则返回"n/a"。
- @埃里克·菲利普斯,我认为你需要加上|| Model.Model2.Model3.Model4.Name == null,以达到同样的逻辑,否则,如果Model.Model2.Model3.Model4.Name是null,mapped.Name将保留null。
- @Razvanr请阅读之前的评论??
- @我想埃里克菲利普斯不是在同一页。如果Model.Model2.Model3.Model4.Name是null,请试着看看在这两种情况下会发生什么。
- 结果是"不适用",请再次阅读第一条评论。dotnetfidle.net工作示例。
- @埃里克菲利普斯:这与第一条评论无关,因为这与你的第一个例子无关。在这个例子中,您可以跳到else分支中,使用mapped.Name = Model.Model2.Model3.Model4.Name -> mapped.Name = null,而第二个例子将替代mapped.Name ="N/A"。查看编辑的dotnetfidle
relatively this is to which makes #纽约C to the更容易激起美国呼叫函数与零或非零to the method chaining值。P></
旧的方式是:the same thing was toP></
1 2 3
| var functionCaller = this.member;
if (functionCaller!= null)
functionCaller.someFunction(var someParam); |
EN has been现在只是easier与自制的多:P></
1
| member?.someFunction(var someParam); |
你读的recommend强:恩。P></
docs.microsoft.com HTTPS:/ / / / /销售额/ Dotnet CSharp语言参考/代理商/空条件算子P></