问题标签 [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 投票
20 回答
41549 浏览

c# - 什么时候在 C# 中使用委托?

您在 C# 中对委托的使用是什么?

0 投票
8 回答
29330 浏览

c# - C# 泛型不允许委托类型约束

是否可以在 C# 中定义一个类

昨晚在 .NET 3.5 中,我终生无法做到这一点。我尝试使用

delegate, Delegate, Action<T> and Func<T, T>

在我看来,这在某种程度上应该是允许的。我正在尝试实现我自己的 EventQueue。

我最终只是这样做了[请注意原始近似]。

但是后来我失去了为不同类型的函数重用相同定义的能力。

想法?

0 投票
1 回答
4353 浏览

asp.net - 带有 ASP.NET 母版页的事件和委托

如何捕捉母版页引发的自定义事件?

在我的母版页上,我有一个自定义事件和委托:

当单击母版页上的链接按钮时会引发此问题。

在页面上的用户控件中,我想订阅该事件,但我不知道我应该如何访问它。通常我会做类似的事情:

但是处理母版页意味着这是不可能的。

0 投票
4 回答
2781 浏览

c# - 由 MS Excel 和 COM 托管的 C# 2 中委托中的异常行为

大家早,

这里有点语言理论问题......我在网上找到了一些参考资料,表明 C# 中的异常处理和委托在某些情况下有一些不同的行为,但我找不到任何关于此事的具体文档。

我们最近在 Microsoft Excel 插件的委托中遇到了一些大问题,导致 MSVC 运行时发生硬崩溃。删除代表解决了这个问题,但我现在很想知道血腥的细节。

作为核心代码的一个简洁示例:

上述结构允许集中形式的错误处理,并且从纯代码的角度来看是简洁明了的。每个公开公开的函数都被声明为委托并通过上述片段执行。

在一个简单的控制台应用程序中,从委托中抛出异常或只是一个普通的意外错误(例如“意外地”在空指针上调用 ToString())按预期工作,并按需要处理错误。

扔进 MS Excel,你会遇到严重的崩溃。单步执行代码将显示错误发生的位置,但在一切都陷入巨大的破坏火球之前,似乎没有发生堆栈展开。

我的假设是,托管 .NET 运行时(以及我们的代码)的 COM 正在做一些不同于正常 .NET 代码执行的事情。这会杀死端点,而 Excel 不知道这一点,而 Excel 又试图通过 COM 访问端点,却发现它不知何故消失了,而 Excel 作为回报也报废了。

这只发生在 Excel+COM+delegates 的组合中,但老实说,我不知道哪个对这种行为影响更大……有什么想法吗?

0 投票
5 回答
3387 浏览

c# - 缓存委托结果

我有一个接受 Predicate<Foo> 并返回匹配项列表的 C# 方法...

过滤器通常是常见的一组...

...但可能是匿名代表。

我现在想让这个方法在 ASP.NET 缓存中缓存它的结果,所以重复调用同一个委托只会返回缓存的结果。为此,我需要从委托创建一个缓存键。Delegate.GetHashCode() 会为此目的产生合理的结果吗?还有其他我应该看的代表成员吗?你会完全以另一种方式来做这件事吗?

0 投票
2 回答
19654 浏览

c# - C# 事件如何在幕后工作?

我正在使用 C#、.NET 3.5。我了解如何利用事件,如何在我的班级中声明它们,如何从其他地方挂钩它们等等。一个人为的例子:

但是,我明白的是,当一个人声明一个事件处理程序时

它从未被初始化——那么 ElementAddedEvent 到底是什么?它指向什么?以下将不起作用,因为 EventHandler 从未初始化:

我注意到有一个 EventHandler.CreateDelegate(...),但所有方法签名都表明这仅用于通过典型的 ElementAddedEvent += new EventHandler(MyMethod) 将委托附加到已经存在的 EventHandler。

I'm not sure if what I am trying to do will help... but ultimately I'd like to come up with an abstract parent DataContext in LINQ whose children can register which table Types they want "observed" so I can have events such as BeforeUpdate and AfterUpdate, but specific to types. Something like this:

Thinking about this made me realize I don't really understand what's happening under the hod with events - and I would like to understand :)

0 投票
2 回答
427 浏览

c# - 在 C# 中附加事件处理程序的 2 种不同方式是否存在实际差异?

在 C# 中,以下之间是否存在任何真正的区别(语法除外):

?

0 投票
7 回答
13304 浏览

c# - C#:虚拟函数调用比委托调用更快?

它只是发生在我的一个代码设计问题上。比如说,我有一个“模板”方法,它调用一些可能“改变”的函数。一个直观的设计是遵循“模板设计模式”。将更改函数定义为要在子类中覆盖的“虚拟”函数。或者,我可以只使用没有“虚拟”的委托函数。委托函数被注入,因此它们也可以被定制。

最初,我认为第二种“委托”方式会比“虚拟”方式更快,但一些代码片段证明它是不正确的。

在下面的代码中,第一个 DoSomething 方法遵循“模板模式”。它调用虚拟方法 IsTokenChar。第二种 DoSomthing 方法不依赖于虚函数。相反,它有一个传入委托。在我的电脑中,第一个 DoSomthing 总是比第二个快。结果就像 1645:1780。

“虚拟调用”是动态绑定,应该比直接委托调用更耗时,对吧?但结果表明并非如此。

有人可以解释一下吗?

0 投票
3 回答
2804 浏览

c# - 如果在 .NET 中将事件实现为委托,那么 .event IL 部分的意义何在?

我在 Stack Overflow 上看到了一些关于委托、事件和这两个功能的 .NET 实现的非常好的问题。特别是一个问题,“ C# 事件如何在幕后工作? ”,产生了一个很好的答案,很好地解释了一些微妙的观点。

上述问题的答案说明了这一点:

当您声明类似字段的事件时......编译器会生成方法和私有字段(与委托的类型相同)。在类中,当您引用 ElementAddedEvent 时,您指的是该字段。在课堂之外,您指的是该领域

从同一问题(“ Field-like events ”)链接的 MSDN 文章补充说:

引发事件的概念完全等同于调用由事件表示的委托——因此,引发事件没有特殊的语言结构。

为了进一步检查,我构建了一个测试项目,以查看事件和委托编译到的 IL:

我希望委托字段handler和事件FooEvent编译成大致相同的 IL 代码,并使用一些额外的方法来包装对编译器生成的FooEvent字段的访问。但生成的 IL 并不完全符合我的预期:

由于事件只不过是编译器生成的委托addremove方法,我没想到会在 IL 中看到事件被视为更多。但是 add 和 remove 方法是在开头的部分中定义的.event,而不是.method像普通方法那样。

我的终极问题是:如果事件被简单地实现为具有访问器方法的委托,那么拥有.eventIL 部分的意义何在?如果没有这个,它们不能通过使用.method部分在 IL 中实现吗?.event相当于.method? _

0 投票
3 回答
1524 浏览

delegates - 通过委托执行可重写方法时,Invoke() 和 BeginInvoke() 的行为不同

谁能告诉我为什么这段代码的行为方式如此?查看代码中嵌入的注释...

我在这里错过了一些非常明显的东西吗?