2014-11-28 4 views
1

У меня есть некоторый код, как это:Является ли эта ссылка потерянной в C#?

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, он должен напрямую изменять данные в словаре, но почему мне все еще нужна эта строка кода, чтобы заставить ее работать?

ответ

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?

+0

достаточно ясно :-) – feilian118

+0

Я добавил несколько соответствующих статей, которые могли бы сделать его еще более ясным –