【问题标题】:C# what does invoke(this, ,) do?C# 调用(this, ,) 做什么?
【发布时间】:2020-08-17 21:57:53
【问题描述】:

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

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

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

【问题讨论】:

  • "如果OnItemAdded不为空,则使用thisitem参数调用它,否则什么都不做"
  • 这能回答你的问题吗? what is invoking?
  • 我不明白您为什么认为代码再次被调用。 this 是对当前类实例的引用。
  • OnItemAdded 似乎是一个事件。如果当前没有订阅此事件,则为 null。 Invoke 将引发该事件。该行(或多或少)是if (OnItemAdded != null) OnItemAdded(this, item); 的快捷方式
  • OnItemAdded 是一个事件(它有错误的事件名称,因为 On.. 名称 should be used 用于引发此事件的方法)。 event.Invoke 将引发事件(调用所有订阅的事件处理程序)。 event?.Invoke 是一个带有空值检查的线程安全调用。

标签: c# this invoke


【解决方案1】:

请参阅this answer 了解为何使用空值检查。在 c# 6.0 之前,最好在调用之前将引用复制到局部变量。这将有助于多线程和订阅者在 null 检查和调用之间取消订阅。

这种形式有几个原因:

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

【讨论】:

  • 谢谢!!!这真的帮助我理解了这行代码!非常感谢。
  • 乐于帮助@Bumbar!
猜你喜欢
  • 2012-11-24
  • 1970-01-01
  • 2012-09-20
  • 2019-06-29
  • 1970-01-01
  • 1970-01-01
  • 2023-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多