我正在学习编程(使用在线资源自学(,我遇到了这段代码。我很难理解。我只理解最后一行OnItemAdded?.Invoke(this, item)
public async Task AddItem(TodoItem item)
{
await CreateConnection();
await connection.InsertAsync(item);
OnItemAdded?.Invoke(this, item);
}
我搜索并阅读了许多资源(在MSN和这里(,如果我正确理解这一点,那么这部分代码会检查OnItemAdded
是否为空,然后这部分代码是否会再次执行?如果OnItemAdded
未能将项目添加到列表中,它是否为空?我能正确阅读和理解这行吗?
请参阅关于为什么使用null检查的答案。在c#6.0之前,最好在调用之前将引用复制到局部变量。这将有助于多线程和订阅者在null检查和调用之间取消订阅。
这种形式有几个原因:
- if evt!=null检查确保我们不会试图调用null代表如果没有人将事件处理程序连接到事件
- 在多线程场景中,由于委托是不可变,一旦我们在evt中获得了委托的本地副本,我们可以在检查非null后安全地调用它,因为没有人可以在if之后但在调用之前更改它