Code Bye

哪位大牛能给讲讲PropertyChanged?.Invoke这句是啥意思

PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(“ErrorTimes”));
尤其是?.这个地方不理解啊,?是允许为null吗?而且去掉?运行就报错了,说要先判断能否为null.
谢谢.
解决方案

40

引用:

写成
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(“ErrorTimes”));
更清楚一些。
不要为了一点点淫巧炫技而写代码。

?. 叫做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)


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明哪位大牛能给讲讲PropertyChanged?.Invoke这句是啥意思