【问题标题】:Delegate Subtractive Assignment委托减法分配
【发布时间】:2014-01-02 12:48:04
【问题描述】:

在 C# 中,委托的行为更像是一个函数指针列表,因此我们可以通过委托调用具有相同方法签名的方法列表。

在初始赋值之后,我们可以使用 +=(加法赋值)和 -=(减法赋值)从委托中添加或减去方法。

说,我有两种方法。

public static void Method1(string message){
  // ...
}

public static void Method2(string message){
  // ...
}

现在,我声明一个委托类型,

public delegate void Del(string message);

如果我想依次执行 Method1、Method2 和 Method1,我可以像这样创建一个委托。

Del delList = Method1;
delList += Method2;
delList += Method1;

然后,稍后在程序中,如果我从中删除 Method1,则删除 Method1 的哪个位置?有什么规则可以管理吗?

我相信更好、更易读的方法是创建一个新委托并按顺序添加您想要执行的方法,而不是更改现有的方法。我只是好奇-= 运算符是如何为 C# 代表实现的。

【问题讨论】:

    标签: c# delegates


    【解决方案1】:

    如果-= 执行的匹配没有删除您想要的,您可以调用GetInvocationList(),按照您的意愿操作,然后创建一个新的委托。

    但是,这只有在您有权访问委托时才有可能。对于只有 operator+=operator-=(订阅和取消订阅)行为的字段,如果您关心调用的顺序,最好避免重复。

    实际上,最好完全避免重复。

    为了回答有关具体行为的问题(尽管我仍然认为依赖它太令人困惑),operator-= 使用 Delegate.Remove, which is documented as

    从另一个委托的调用列表中删除一个委托的调用列表的最后一次出现。

    (Delegate 类本身的文档说“托管语言使用CombineRemove 方法来实现委托操作。示例包括Visual Basic 中的AddHandlerRemoveHandler 语句以及+=-= C# 中委托类型的运算符。")

    【讨论】:

      猜你喜欢
      • 2011-09-15
      • 2013-12-25
      • 2015-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      相关资源
      最近更新 更多