2015-08-18 2 views
0

Я читал о делегате многоадресной передачи, и мысль о распределении памяти остановила меня. . Может кто-то explaing, как это делается распределение памяти многоадресного делегата (я намеренно не добавил события, чтобы сделать его проще для меня, чтобы понять) В этой программе:Распределение памяти делегата многоадресной передачи

using System; 

delegate int MyDelegate(int a,int b); 
namespace DelegateAppl 
{ 
    class DelegateTest 
    { 

     public static int AddNum(int p,int q) 
     { 
      int add = p + q; 
      return add; 
     } 

     public static int MultNum(int p, int q) 
     { 
      int mul = p * q; 
      return mul; 
     } 


     static void Main(string[] args) 
     { 
      MyDelegate myDel = new MyDelegate(AddNum); 
      myDel += new MyDelegate(MultNum); 


      int result = myDel(2, 5); 
      Console.WriteLine("Value of Num: {0}", result); 

      Console.ReadKey(); 
     } 
    } 
} 

Как Mydelegate будет allocated.Will это имеют размер addNum или MultNum или добавление обоих размеров?

MyThoughts -The будет компилятор выделить память (я понятия не имею, сколько) в Mydelegate и будет хранить это в cache.It будет затем выделяет память в соответствии с методом (ADD), а затем удаляет, а затем снова выделяет память по методу Multiply при вызове через делегатов. Я правильно понимаю?

+0

Если у вас достаточно делегатов для их полной памяти, чтобы составить ненулевой процент от вашего приложения, вы делаете что-то очень не так. Вы не должны заботиться о том, сколько памяти требуется для делегата; он будет округлен до нуля. – Servy

+0

Спасибо, сэр, я просто хотел знать, как работать с памятью делегатов многоадресной рассылки. Я не намерен изменять или делать что-либо подозрительное. Просто для того, чтобы узнать, что происходит в случае делегатов многоадресной передачи, поскольку мы можем иметь делегат, который обновляется до двух методов, один, который печатает строку и другие, делает что-то с int. – Vicky

+0

Почему downvote.I много искал перед публикацией, но мог получить любой ответ, так что отправил сообщение. В следующий раз вам будет задан вопрос о правильном образе. Приобрести, если это будет ниже уровня – Vicky

ответ

1

Делегат скомпилирован в закрытый закрытый класс (содержащего класс), который скрыт от вас - он создается во время компиляции. Каждый раз, когда вы инициализируете делегата, например MyDelegate myDel = new MyDelegate(AddNum);, вы фактически инициализируете экземпляр этого скрытого класса. Этот класс также содержит поле _invocationList типа System.Object, которое используется для ссылки на другой делегат и назначается через Delegate.Combine(Delegate that, Delegate other), что и происходит, когда вы пишете myDel += new MyDelegate(MultNum);. Из этого вы можете понять, как распределена память - это создание обычных объектов.

+0

Спасибо, сэр, тогда в случае объявления многоадресной рассылки с анонимным методом размер объекта делегатов будет объединять размер всего метода это относится.Скажем, если делегат d ссылается на 5 методов (a, b, c, d, e), то 5 refrence будет добавлено в _invocationList, что стало мусором, поскольку мы не сохранили их в будущем (они просто анонимны) .Am Я правильно понимаю? и является ли размер refrence в _invocationList фиксированным? – Vicky

+0

'_invocationList' похоже на поле« Next »связанного списка, указывающее на следующий делегат в цепочке. Анонимный метод все равно компилируется в закрытый метод, поэтому они не являются особым случаем. Когда вы связываете 5 делегатов, вы просто создаете связанный список из 5 узлов. –

+0

Спасибо, любая информация о размере, если бы вы могли указать размер этого поля Next? Является ли он равным размеру метода, который он указывает, или некоторому фиксированному значению? – Vicky

Смежные вопросы