указатель на методы в C # делегатах - PullRequest
0 голосов
/ 07 августа 2011

В следующем коде ptrcall указывает ...

  • до 2 мест в куче с методами obj.callMe и obj1.callMe; или ...
  • в 1 место, в котором есть оба метода obj.callMe, obj1.callMe внутри него?

    public delegate void CallEveryOne();
    
    private void Form1_Load(object sender, EventArgs e)
    {
    
    public CallEveryOne ptrcall=null;
    
    public Form2 obj = new Form2();
    public Form3 obj1 = new Form3();
    
        obj.Show();
        obj1.Show();
    
        ptrcall += obj.CallMe;
        ptrcall += obj1.CallMe;
    } 
    

Ответы [ 2 ]

3 голосов
/ 07 августа 2011

ptrcall, как и все остальные делегаты начиная с .NET 2.0, является многоадресным делегатом. То есть он хранит свой внутренний список методов, на которые ссылается. MSDN может сказать следующее на MulticastDelegate:

Представляет делегат многоадресной рассылки; то есть делегат, который может иметь более одного элемента в своем списке вызовов . & quot; (выделение мной добавлено).

Итак, в вашей терминологии ответ, скорее всего, ptrcall указывает на 2 место в куче.

Но почему эта деталь реализации вообще имеет значение?


P.S .: Вы можете позвонить ptrcall.GetInvocationList() и посмотреть, что вы получите. Я только рекомендую это вам для того, чтобы играть и лучше узнавать делегатов; не делайте этого в производственном коде, если вы действительно не должны .

0 голосов
/ 07 августа 2011

Полагаю, вы хотите знать это для взаимодействия с неуправляемым коэффициентом?Ptrcall хранит ссылку на экземпляр объекта типа CallEveryOne (который происходит от типа MulticastDelegate).Этот объект содержит (помимо прочего) внутренний массив с информацией о каждом методе, добавленном к этому делегату, но вы не собираетесь использовать его напрямую.Если вам нужны указатели для подписанных методов, используйте ptrcall.GetInvocationList () для получения списка методов и System.Runtime.InteropServices.Marshal.GetFunctionPointerForDelegate () для преобразования их в указатели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...