问题标签 [delegates]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1357 浏览

c# - 如何阻止异常破坏我的委托链?

我遇到了一个常见的问题。当我有一个事件可能被几个不同的类订阅时,这些类之一抛出的异常将终止回调链;因为我不知道执行回调的先验顺序,这可能会导致某些类的不可预测的状态更改,而不是其他类。

在圣经中(通过 C# 的 CLR,我使用的是 C# 2.0)有一小段关于使用MulticastDelegate.GetInvocationList来解决这个问题,但仅此而已。所以我的问题是:处理这个问题的最佳方法是什么?我MulticastDelegate.GetInvocationList每次有活动都必须使用吗?或者我是否需要将所有可能作为委托链的一部分调用的方法包含在某种回滚机制中?与在 C# 中如此易于使用的简单事件/委托模型相比,为什么所有这些选项都如此复杂?我怎样才能使用简单的方法而不会导致损坏状态?

谢谢!

0 投票
2 回答
4092 浏览

c# - c# - 为动态创建的控件分配方法

我正在设计一个支持插件开发的应用程序。它更多的是一种学习练习。

加载到我的应用程序中的所有程序集(插件)都包含一个 showPrefs() 方法。当我加载每个程序集时,我想为每个程序集分配一个按钮,以便当我单击该按钮时,它会触发该按钮分配到的程序集的 showPrefs() 方法。

我该怎么做呢?一个快速而肮脏的解决方案是将 showPrefs() 方法签名更改为 showPrefs(object sender, EventArgs e)。这样我可以将它分配给按钮,但我认为这是一个便宜的解决方法。

有任何想法吗?


click 事件处理程序只接受具有 (object o, EventArgs e) 方法签名的委托,所以我不知道如何将 showPrefs() 方法分配给 click 事件。

这就是我遇到的麻烦。

0 投票
3 回答
6108 浏览

c# - EventHandlers 和匿名委托 / Lambda 表达式

我希望通过匿名委托和 lambda 表达式来清除一些事情,这些表达式用于在 C# 中为事件处理程序创建一个方法,至少对我自己而言。

假设我们有一个添加匿名委托或 lambda 表达式的事件(对于可以使用较新版本 .NET 的幸运人群)。

我读到过去人们已经忘记了仍然具有阻止类被垃圾收集的处理程序的事件。如果不只是在类中将 SomeEvent 设置为 null ,将如何删除添加的处理程序。以下不是一个全新的处理程序吗?

我可以看到将匿名委托或 lambda 表达式存储在变量中。但是,至少对我来说,这似乎违背了能够简单而简洁地添加事件处理程序的整个目的。

再说一次,我明白你可以这样做......

但我更有趣的是从事件中删除动态创建的方法。希望有人可以为我阐明这一点。谢谢!

0 投票
3 回答
3458 浏览

c# - 代表和 Lambdas 和 LINQ,天哪!

作为一名相当初级的开发人员,我遇到了一个突出我缺乏经验和知识漏洞的问题。如果这里的序言太长,请见谅。

我发现自己在一个项目中需要学习一些新的(对我来说)技术,包括 LINQ(为了这个项目的目的到 OBJECTS 和到 XML)等等。到目前为止,我所读到的所有内容都表明,要使用 LINQ,我需要完全理解以下内容(委托、匿名方法和 Lambda 表达式)。

好的,现在乐趣来了。过去我曾在使用 .NET 事件模型时使用过代表,但大部分细节对我来说是隐藏的(感谢 Microsoft!)。我知道,在基本层面上,委托实例是指向方法的指针(我知道,这太简单了)。

我了解匿名方法本质上是一种内联未命名方法,通常(如果不是专门)创建为委托的目标。

我也了解 lambda 以不同的方式使用以简化语法,并可用于将简单的匿名方法指向委托。

请原谅我的任何描述与此处不符,这是我理解这些主题的基本水平。

所以,挑战:

  1. 如果我对这些项目的理解甚至接近,谁能告诉我至少在基本层面上?我不是在寻找复杂的深奥细节,只是基础知识(目前)。

  2. 在将 LINQ 应用到项目中以达到合理效果之前,我需要在多大程度上真正理解这些概念?我想完全理解它并愿意花时间。在我需要制作一些作品之前,我可能根本没有时间完全了解所有这些东西。

  3. 任何人都可以向我指出一些解释这些主题并将它们应用于“现实世界”示例的好文章,以便我可以了解主题的基础知识和它们的应用吗?我所说的现实世界的意思是,我如何在“客户和发票”而不是抽象的“矢量和形状”或“动物和奶牛”的上下文中使用它。出于演示目的,该场景可能有些人为,但希望不是严格的学术性的。我在网上和书中找到了许多示例,但似乎很少有“简单的英语”解释。

提前感谢大家的耐心、时间和专业知识。

0 投票
8 回答
23359 浏览

python - Python:回调、委托、...?什么是常见的?

只是想知道在 python 中对事件做出反应的常用方法是什么。在其他语言中有几种方法,如回调函数、委托、侦听器结构等。有没有通用的方法?有哪些默认语言概念或附加模块,您可以推荐哪些?

0 投票
4 回答
4034 浏览

c# - 为什么我的循环使用 100% CPU 并且永远不会结束?

我有这个方法:

它从进程 (cmd.exe) 中读取流。当用户关闭 cmd.exe 窗口时,会导致 CPU 使用率跃升至 100%。使用调试器时,我看到它在 sr.ReadLine() 上停止并且永远不会返回。因为这是同时观察 StandardErrorStream 和 StandardOutputStream 它在两个内核上都使用 100%。

如果您需要,这里还有一些项目代码。

另一个有趣的是,它并不总是像应有的那样隐藏 cmd 窗口。它第一次隐藏它,然后第二次(或之后)它不会隐藏它。这是用户可以关闭 cmd.exe 窗口并使 readline 变得有趣的时候。它也永远不会读取输出到 cmd 的最后一行,除非它退出。

对于如何解决这个问题,有任何的建议吗?

0 投票
2 回答
636 浏览

c# - 在方法调用之间缓存了哪些(如果有)本地定义的委托?

我在另一个问题中提到了这一点,我认为将其添加到记录中可能很有用。在下面的程序中,如果有的话,哪些本地定义的委托在调用 Work 方法之间被缓存,而不是每次都从头开始创建?

0 投票
6 回答
16517 浏览

iphone - 在 Objective-C 中实现委托模式

我正在构建一个处理 NSURLConnection 请求的类。为了允许其他类使用这个类,我想允许主类在触发 connectionDidFinishLoading 时调用委托。

我查看了很多文档,但找不到任何给出明确示例的内容,并且由于某种原因,我拥有的代码没有调用委托。我到目前为止的代码是(代码不相关已删除):

界面:

执行:

另一个类中的委托:

0 投票
3 回答
2964 浏览

iphone - 在 Objective-C 中作为外部类委托

我正在使用 Xcode 和 Interface Builder 为 iPhone 创建一个简单的项目。虽然我了解什么是委托,但我在使用它时遇到了问题。

我的界面中有一个 UITextField 。当用户点击它时它会显示键盘,但我需要手动编程如何隐藏键盘。可以使用委托来完成。所以在 IB 中,我从库中获取对象,将它的类名指定为 Control1Delegate,然后将我的文本字段中的委托出口连接到这个 Control1Delegate。我也有这个 Control1Delegate 类的 .m 和 .h 文件:

Control1Delegate.h

Control1Delegate.m

但这不起作用。运行时,它永远不会到达 textFieldShouldReturn 方法,或者在没有 msg 或 EXEC_BAD_ACCESS 的情况下崩溃。有趣的是,当我将方法移动到控制器文件(已生成一个向导)并从 UITextField 连接到此控制器(文件所有者)时,一切都按预期工作。我看到大多数苹果代码教程将委托方法放入随机对象而不是单独的类中 - 我想知道为什么。我不能在单独的班级中有代表吗?

我在这里缺少什么?一些空指针?对象生命周期?

0 投票
3 回答
470 浏览

c# - .NET Framework 中是否存在用于比较的现有委托?

.NET 框架为常见任务提供了一些方便的通用委托,例如Predicate<T>EventHandler<T>.

是否有相当于 CompareTo() 的内置委托?

签名可能是这样的:

这是为了实现排序,以便我可以为实际的排序例程(特别是 ListView.ListViewItemSorter)提供 lambda 表达式,因此欢迎使用任何其他方法。