首页 > 解决方案 > C# 调用(this, ,) 做什么?

问题描述

我正在学习编程(通过在线资源自学),我遇到了这段代码。我很难理解它。我不明白只有最后一行OnItemAdded?.Invoke(this, item)

public async Task AddItem(TodoItem item)
{
   await CreateConnection();
   await connection.InsertAsync(item);
   OnItemAdded?.Invoke(this, item);
}

我搜索并阅读了许多资源(在 MSN 和此处),如果我理解正确,那么这部分代码检查是否OnItemAdded不为空,然后再次执行这部分代码?如果OnItemAdded它未能将项目添加到列表中,它不为空吗?我是否正确阅读并理解了这一行?

标签: c#thisinvoke

解决方案


请参阅此答案,了解为何使用空检查。在 c# 6.0 之前,在调用之前将引用复制到局部变量是一种很好的做法。这将有助于多线程和订阅者在空检查和调用之间取消订阅。

这种形式有几个原因:

  • if evt != null 检查确保我们不会尝试调用 null 委托。如果没有人将事件处理程序连接到事件,就会发生这种情况
  • 在多线程场景中,由于委托是不可变的,一旦我们获得了委托的本地副本到 evt,我们可以在检查非 null 后安全地调用它,因为没有人可以在 if 之后但在调用之前更改它。

推荐阅读