Помогите объяснить код с делегатами - PullRequest
1 голос
/ 26 мая 2011

Я новичок в C # и в фреймворке, с которым я играю, и я пытаюсь выяснить, как работает некоторый код (в коде нет ничего плохого).Это клиент-серверное приложение, которое отправляет некоторый текст с клиента на сервер, а затем получает и отображает ту же строку в текстовом поле.Код ниже взят от клиента и его формы.Только материал для получения строки с сервера включен сюда.Я включил некоторые комментарии из фреймворка.

public class TestModuleMobile : PreCom.Core.ModuleBase, PreCom.Core.IForm
{
    public delegate void ReceiveDelegate(string data);
    public event ReceiveDelegate DataReceived;

    public void Receive(byte[] data)
    {
        string text = Encoding.UTF8.GetString(data, 0, data.Length);

        if (DataReceived != null)
            DataReceived.Invoke(text);
    }

    public override bool Initialize()
    {
        PreCom.Application.Instance.Communication.Register(99, Receive);         
    // Register(uint receiverID, RecieveDelegate receiver): Called by modules to register for communication.
    //
    //      Parameters: 
    //          receiverID:
    //              Module Id
    //          receiver:
    //              The module receive function that will be called by the framework when data
    //              arrives to specific module. (This method should return as soon as possible
    //              to avoid timeouts)
        _isInitialized = true;
        return true;
    }
}

public partial class TestModuleMobileForm : PreCom.Controls.PreComForm
{
    TestModuleMobile _module;

    public TestModuleMobileForm(TestModuleMobile module)
    {
        _module = module;
        _module.DataReceived += new TestModuleMobile.ReceiveDelegate(DataReceived);
        InitializeComponent();
    }

    void DataReceived(string data)
    {
        if (InvokeRequired)
        {
            ThreadStart myMethod = delegate { DataReceived(data); };
            this.BeginInvoke(myMethod);
            return;
        }  
        listBox1.Items.Insert(0, data);
        this.preComInput21.Text = "";
    }
}

Вопросы:
1. public override bool Initialize ()
Вызов функции Register принимает объект ReceiveDelegate в качестве второго параметра.Итак, как я могу отправить функцию (получить), когда это просто функция?Как это работает?

2. public void Receive (данные байта [])
Что происходит в случае if?Как вызывать работу?

3. void DataReceived (строковые данные)
Что происходит в случае if (строка за строкой)?

Ответы [ 2 ]

1 голос
/ 26 мая 2011

Вам необходимо полное понимание делегатов, поэтому вам лучше начать с чтения их в следующем порядке:

  1. Делегаты (Руководство по программированию в C #)
  2. Учебное пособие для делегатов
  3. Делегаты и события в C # / .NET
1 голос
/ 26 мая 2011

В Stackoverflow есть много связанных постов, которые вы можете просмотреть, чтобы лучше понять делегатов.Прочитав их, взгляните на свой код, и вам станет легче его понимать.

Подсказка: перейдите в правую часть этой веб-страницы, чтобы увидеть все соответствующие сообщения.

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