在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#代理如何实现-=
运算符感到好奇。
答案 0 :(得分:2)
如果-=
执行的匹配没有删除您想要的匹配,则可以调用GetInvocationList()
,按照您的需要进行操作,并创建新的代理。
但是,只有在您有权访问委托时才有可能。对于只有operator+=
和operator-=
(订阅和取消订阅)行为的字段,如果您关心调用的顺序,最好避免重复。
实际上,最好完全避免重复。
要回答有关具体行为的问题(尽管我仍然认为依赖它的行为太令人困惑),operator-=
使用Delegate.Remove
, which is documented as:
从另一个委托的调用列表中删除最后一次出现的委托调用列表。
(Delegate类本身的文档说“托管语言使用Combine
和Remove
方法来实现委托操作。示例包括AddHandler
和RemoveHandler
语句Visual Basic以及C#中委托类型的+=
和-=
运算符。“)