PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(“ErrorTimes”));
尤其是?.这个地方不理解啊,?是允许为null吗?而且去掉?运行就报错了,说要先判断能否为null.
谢谢.
尤其是?.这个地方不理解啊,?是允许为null吗?而且去掉?运行就报错了,说要先判断能否为null.
谢谢.
解决方案
40
?. 叫做null-conditional operator(空值的条件访问操作符),是C#6新增的语言特色。
其实,“空值的条件访问操作符”还是很受欢迎的。它让C#的表达力更强。相同的表达,没有用?.操作符,要多好几条语句。而且,?.操作符是C#语言特色,有VisualStudio2015或以上,就可以编译使用。它跟DotNet运行版本没有关系,DotNet4可以用它,DotNet2等也可以用它。
// 以下代码不是工业级的做法,原因是“检查空值”,和“进行调用”是两个动作。不是线程安全的。 if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("ErrorTimes"));
// ?.操作符号,实现了相似代码(线程安全版本): var localCopy = PropertyChanged; if (localCopy != null) { localCopy(this, new PropertyChangedEventArgs("ErrorTimes")); }
很有意思的是在本人的VisualStudio2015下,假如你写上述线程安全版本。VisualStudio将建议你换成?.的方式:
(IDE1005 delegate invocation can be simplified)