Реализация делегатов в C # - PullRequest
       10

Реализация делегатов в C #

3 голосов
/ 16 апреля 2010

Я пытаюсь узнать, как эффективно использовать делегаты в C #, и мне просто интересно, может ли кто-нибудь помочь мне через ... Ниже приведен пример реализации с использованием делегатов ... Все, что я делаю, это просто передаю значение через делегата из одного класса в другой ... Скажите, пожалуйста, это правильный способ реализации ... А также ваши предложения ...

Также обратите внимание, что я снял с регистрации делегата в:

void FrmSample_FormClosing(object sender, FormClosingEventArgs e)
{
     sampleObj.AssignValue -= new Sample.AssignValueDelegate(AssignValue);
}

Нужна ли эта отмена регистрации?

Ниже приведен код, который я написал ..

public partial class FrmSample : Form
{
    Sample sampleObj;

    public FrmSample()
    {
        InitializeComponent();

        this.Load += new EventHandler(FrmSample_Load);
        this.FormClosing += new FormClosingEventHandler(FrmSample_FormClosing);

        sampleObj = new Sample();
        sampleObj.AssignValue = new Sample.AssignValueDelegate(AssignValue);            
    }

    void FrmSample_FormClosing(object sender, FormClosingEventArgs e)
    {
        sampleObj.AssignValue -= new Sample.AssignValueDelegate(AssignValue);
    }

    void FrmSample_Load(object sender, EventArgs e)
    {
        sampleObj.LoadValue();
    }

    void AssignValue(string value)
    {
        MessageBox.Show(value);
    }
}

class Sample
{
    public delegate void AssignValueDelegate(string value);
    public AssignValueDelegate AssignValue;

    internal void LoadValue()
    {
        if (AssignValue != null)
        {
            AssignValue("This is a test message");
        }
    }
}

Пожалуйста, оставьте свой отзыв о том, правильно ли это ...

Спасибо, Ram

Ответы [ 3 ]

6 голосов
/ 16 апреля 2010

Явная отмена регистрации обработчиков событий необходима только тогда, когда ссылка на событие поддерживает объект, который содержит цель делегата, слишком долго. В вашем случае sampleObj будет иметь ссылку на объект Form. Синтаксис C # сахар скрывает это, компилятор фактически генерирует этот код:

sampleObj.AssignValue = new Sample.AssignValueDelegate ( это , AssignValue);

Если аргумент this инициализирует свойство Delegate.Target, а аргумент AssignValue инициализирует свойство Delegate.Method.

Это означает, что до тех пор, пока объект sampleObj остается на ссылке, на объект формы тоже остаются ссылки, и он не будет собирать мусор. Однако в вашем случае единственный объект, который имеет ссылку на sampleObj, - это сам объект формы. Сборщик мусора не имеет проблем с циклическими ссылками, подобными этим, и обнаружит, что нет никаких других ссылок ни на один объект. И соберу их обоих одновременно.

Существует одно (необычное) исключение: у вас возникнут проблемы с классом sampleObj, генерирующим события после , когда форма закрыта. Что может произойти, если событие вызвано чем-то за пределами формы, например, некоторым аппаратным событием. Это событие все еще может запустить код в классе формы. Обычно вы замечаете это быстро, любая попытка ссылки на элемент управления в форме вызовет исключение ObjectDisposed.

1 голос
/ 16 апреля 2010

Делегат Action может быть более подходящим в этом случае - это особая форма делегата, которая принимает 1–3 параметра без возвращаемого значения:

Использование делегата действия в C #

1 голос
/ 16 апреля 2010

Нет необходимости отменять регистрацию делегатов. Образец obj живет в области видимости и будет уничтожен после закрытия формы

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