我有一些像这样的代码:
public delegate void InputEventListener<T>(T e) where T : InputEvent;
private Dictionary<System.Type, System.Delegate> processors = new Dictionary<System.Type,System.Delegate>();
public bool RegisteEventListener<T>(InputEventListener<T> listener) where T : InputEvent
{
System.Type tt = typeof(T);
if(!processors.ContainsKey(tt))
{
InputEventListener<T> lis = new InputEventListener<T>(listener);
processors.Add(tt, lis);
return true;
}
InputEventListener<T> aaa = processors[tt] as InputEventListener<T>;
aaa += (listener);
//key point
processors[tt] = aaa;
return true;
}
当我尝试将第二个侦听器添加到具有相同类型的处理器中时,如果我不调用关键点行:
processors[tt] = aaa;
字典不会存储侦听器。但是委托应该是一个引用类型吧?当我修改aaa时,它应该直接更改字典中的数据,但为什么我仍然需要这行代码才能使它工作?
答案 0 :(得分:1)
委托类型是引用类型,是的。但是像System.String
一样,它们是不可变的。当您编写看起来像你正在修改实例的代码时,实际上是在创建一个带有新值的新实例。
因此,如果您在字典中有一个委托实例,然后编写类似aaa += (listener);
的内容,那么您将创建一个全新的委托实例并将其分配给变量aaa
。原始委托实例仍然是字典中的一个(或者在任何地方......在引用原始委托实例的位置并不重要,它总是保持不变)。
以下是其他几个相关答案:
Why .net delegate assignment operator is not assigning the reference to the original delegate?
If delegates are immutable, why can I do things like x += y?