【问题标题】:When chaining .NET delegates, how are the original instances (re)used?链接 .NET 委托时,如何(重新)使用原始实例?
【发布时间】:2009-03-12 10:32:39
【问题描述】:

假设我有以下 C# 代码:

Action a = TestMethod;
Action b = TestMethod;
Action c = b;
b += a;

Tests 表明bc 不是同一个实例,因此很明显+ 运算符似乎创建了一个新的委托实例。这是一个正确的假设吗?它是在内部重用b-instance,还是只是将方法/目标信息复制到新实例?

我似乎无法为代表找到 + 运算符的实现,Delegate 类似乎不包含它。

谁能解释一下这个问题?

我问的原因是我正在创建一些类,它们会像洋葱一样相互分层,最外层将调用内层,获取一些委托,然后将更多方法附加到这些委托,我'我只是担心这样做会以某种方式改变我从内层获得的委托,在这种情况下,我需要返回副本/克隆,而不仅仅是内部引用。

请注意,这完全是我的库的内部代码,所以虽然我知道传递这样的内部数据结构通常是个坏主意,但如果我可以安全地使用这些类,那么我会这样做。

【问题讨论】:

    标签: c# .net delegates chaining instances


    【解决方案1】:

    正如 Kent 所说,+= 使用 Delegate.Combine,-= 使用 Delegate.Remove。更多信息请查看我的events/delegates article

    重要的是委托是不可变的——调用组合/删除根本不会改变你调用它的委托——所以你不需要克隆任何东西。对于您对委托执行的任何其他操作也是如此:例如,如果您获取调用列表并更改返回数组的内容,则不会改变委托实际执行的操作。

    (这就像 String 的行为,如果你想换一种方式思考的话。)

    【讨论】:

    • 谢谢,一切都简单了。
    【解决方案2】:

    += 等价于Delegate.Combine()-= 等价于 Delegate.Remove()。每个都创建一个新的Delegate 实例并返回它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多