问题标签 [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.
c# - 什么时候在 C# 中使用委托?
您在 C# 中对委托的使用是什么?
c# - C# 泛型不允许委托类型约束
是否可以在 C# 中定义一个类
昨晚在 .NET 3.5 中,我终生无法做到这一点。我尝试使用
delegate, Delegate, Action<T> and Func<T, T>
在我看来,这在某种程度上应该是允许的。我正在尝试实现我自己的 EventQueue。
我最终只是这样做了[请注意原始近似]。
但是后来我失去了为不同类型的函数重用相同定义的能力。
想法?
asp.net - 带有 ASP.NET 母版页的事件和委托
如何捕捉母版页引发的自定义事件?
在我的母版页上,我有一个自定义事件和委托:
当单击母版页上的链接按钮时会引发此问题。
在页面上的用户控件中,我想订阅该事件,但我不知道我应该如何访问它。通常我会做类似的事情:
但是处理母版页意味着这是不可能的。
c# - 由 MS Excel 和 COM 托管的 C# 2 中委托中的异常行为
大家早,
这里有点语言理论问题......我在网上找到了一些参考资料,表明 C# 中的异常处理和委托在某些情况下有一些不同的行为,但我找不到任何关于此事的具体文档。
我们最近在 Microsoft Excel 插件的委托中遇到了一些大问题,导致 MSVC 运行时发生硬崩溃。删除代表解决了这个问题,但我现在很想知道血腥的细节。
作为核心代码的一个简洁示例:
上述结构允许集中形式的错误处理,并且从纯代码的角度来看是简洁明了的。每个公开公开的函数都被声明为委托并通过上述片段执行。
在一个简单的控制台应用程序中,从委托中抛出异常或只是一个普通的意外错误(例如“意外地”在空指针上调用 ToString())按预期工作,并按需要处理错误。
扔进 MS Excel,你会遇到严重的崩溃。单步执行代码将显示错误发生的位置,但在一切都陷入巨大的破坏火球之前,似乎没有发生堆栈展开。
我的假设是,托管 .NET 运行时(以及我们的代码)的 COM 正在做一些不同于正常 .NET 代码执行的事情。这会杀死端点,而 Excel 不知道这一点,而 Excel 又试图通过 COM 访问端点,却发现它不知何故消失了,而 Excel 作为回报也报废了。
这只发生在 Excel+COM+delegates 的组合中,但老实说,我不知道哪个对这种行为影响更大……有什么想法吗?
c# - 缓存委托结果
我有一个接受 Predicate<Foo> 并返回匹配项列表的 C# 方法...
过滤器通常是常见的一组...
...但可能是匿名代表。
我现在想让这个方法在 ASP.NET 缓存中缓存它的结果,所以重复调用同一个委托只会返回缓存的结果。为此,我需要从委托创建一个缓存键。Delegate.GetHashCode() 会为此目的产生合理的结果吗?还有其他我应该看的代表成员吗?你会完全以另一种方式来做这件事吗?
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 :)
c# - 在 C# 中附加事件处理程序的 2 种不同方式是否存在实际差异?
在 C# 中,以下之间是否存在任何真正的区别(语法除外):
和
?
c# - C#:虚拟函数调用比委托调用更快?
它只是发生在我的一个代码设计问题上。比如说,我有一个“模板”方法,它调用一些可能“改变”的函数。一个直观的设计是遵循“模板设计模式”。将更改函数定义为要在子类中覆盖的“虚拟”函数。或者,我可以只使用没有“虚拟”的委托函数。委托函数被注入,因此它们也可以被定制。
最初,我认为第二种“委托”方式会比“虚拟”方式更快,但一些代码片段证明它是不正确的。
在下面的代码中,第一个 DoSomething 方法遵循“模板模式”。它调用虚拟方法 IsTokenChar。第二种 DoSomthing 方法不依赖于虚函数。相反,它有一个传入委托。在我的电脑中,第一个 DoSomthing 总是比第二个快。结果就像 1645:1780。
“虚拟调用”是动态绑定,应该比直接委托调用更耗时,对吧?但结果表明并非如此。
有人可以解释一下吗?
c# - 如果在 .NET 中将事件实现为委托,那么 .event IL 部分的意义何在?
我在 Stack Overflow 上看到了一些关于委托、事件和这两个功能的 .NET 实现的非常好的问题。特别是一个问题,“ C# 事件如何在幕后工作? ”,产生了一个很好的答案,很好地解释了一些微妙的观点。
上述问题的答案说明了这一点:
当您声明类似字段的事件时......编译器会生成方法和私有字段(与委托的类型相同)。在类中,当您引用 ElementAddedEvent 时,您指的是该字段。在课堂之外,您指的是该领域
从同一问题(“ Field-like events ”)链接的 MSDN 文章补充说:
引发事件的概念完全等同于调用由事件表示的委托——因此,引发事件没有特殊的语言结构。
为了进一步检查,我构建了一个测试项目,以查看事件和委托编译到的 IL:
我希望委托字段handler
和事件FooEvent
编译成大致相同的 IL 代码,并使用一些额外的方法来包装对编译器生成的FooEvent
字段的访问。但生成的 IL 并不完全符合我的预期:
由于事件只不过是编译器生成的委托add
和remove
方法,我没想到会在 IL 中看到事件被视为更多。但是 add 和 remove 方法是在开头的部分中定义的.event
,而不是.method
像普通方法那样。
我的终极问题是:如果事件被简单地实现为具有访问器方法的委托,那么拥有.event
IL 部分的意义何在?如果没有这个,它们不能通过使用.method
部分在 IL 中实现吗?.event
相当于.method
? _
delegates - 通过委托执行可重写方法时,Invoke() 和 BeginInvoke() 的行为不同
谁能告诉我为什么这段代码的行为方式如此?查看代码中嵌入的注释...
我在这里错过了一些非常明显的东西吗?