gpt4 book ai didi

c# - 为什么我可以检查一些事件处理程序是否为空,而有些则不能?

转载 作者:行者123 更新时间:2023-11-30 19:21:02 24 4
gpt4 key购买 nike

我有一段添加事件处理程序的丑陋代码。问题是,如果多次调用代码,则会多次调用事件处理程序。

为了解决这个问题,我先删除了事件处理程序,然后再添加它。

现在我看到了以下行为:

一些事件处理程序可以像这样检查:

if (object.event == null) {
//
// Code
//
}

其他形式

if (object.object.event == null) {
//
// Code
//
}

我收到一条消息,例如“object.object.event”可能只发生在 -= 或 += 的左侧。(因为我使用的是德语版的 visual studio,所以我不知道正确的英语翻译)。

我不知道为什么这种行为看起来如此无关紧要,所以如果能提供一些相关信息,我将不胜感激。

更具体地说:它是用户控制。

if (myControl.Event == null) {
//
// works
//
}

if (myControl.TreeView.NodeMouseClick == null) {
//
// doesn't work
//
}

最佳答案

To solve the problem, I remove the event handler first and then add it.

这并不能解决问题。 event 关键字为委托(delegate)对象提供访问器。就像属性为字段提供访问器一样。在一处特性上,您总是需要一个getset。事件具有添加、删除和引发访问器。但是如果你自己不这样做,编译器会为它们生成一个默认实现。这很常见。

属性访问器的优点是支持字段可以是私有(private)的。除了包含该字段的类之外,没有人可以弄乱它。所有访问都必须通过 get 和 set 访问器。 event 关键字的工作方式完全相同,除了包含该事件的类中的代码外,没有人可以弄乱委托(delegate)对象。

这会在您避免引发事件的尝试中射出一个大洞。您不能弄乱在另一个类中声明的事件的订阅者列表,编译器告诉您这一点。完成此操作的正常方法是设置一个 bool 标志以指示必须暂时忽略事件。事件处理程序可以检查该标志并避免执行任何副作用。

关于c# - 为什么我可以检查一些事件处理程序是否为空,而有些则不能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4501308/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com