Понимание использования событий C # для объекта отправителя - PullRequest
2 голосов
/ 07 октября 2009

Я довольно плохо знаком с C # как языком (происходящим из фона C ++), и в настоящее время я нахожусь в процессе написания приложения, использующего API, управляемый событиями.

В первую очередь это состоит из регистрации обработчиков событий / ответов и запуска мониторов событий, которые затем обрабатывают эти асинхронные события / ответы.

У меня возникли проблемы с пониманием, это использование объекта отправителя.

Я хотел бы использовать его для передачи дескриптора имеющемуся у меня объекту класса с различными структурами и данными при выполнении запроса (или настройке монитора). И затем по полученному ответу / вызываемому событию я могу взять объект отправителя, привести его обратно к ожидаемому типу класса и получить доступ к членам, внести дальнейшие изменения и т. Д., Так чтобы он воспринимался как указатель на исходные данные (что, я надеюсь, будет?).

Так что мой вопрос на самом деле заключается в том, что, когда я передаю объект класса в своем запросе, это будет фактически ссылкой или это будет скопировано где-то вдоль строки по значению, поскольку на самом деле это просто общий объект, и я закончу с пустой копией моего объекта класса на событие?

Или третий вариант, что я, возможно, здесь совершенно не на том пути и должен все это забыть? :)

Проблема в том, что мой мозг все еще работает в режиме указателей, я думаю ...

Ответы [ 4 ]

13 голосов
/ 07 октября 2009

Это ссылка. Попробуйте этот код, чтобы увидеть, как он работает:

private void textBox1_TextChanged(object sender, EventArgs e)
{
    Whatever(sender);
}

private void Whatever(object sender)
{
    TextBox tb = (TextBox)sender;
    tb.Text = "yo";
}

Если бы object не было передано по ссылке, textBox1 сохранит любой введенный вами текст.

7 голосов
/ 07 октября 2009

Я не знаю, что я полностью понимаю ваш вопрос. Но ответить вам частично:

Вы получите ссылку на ваш объект.

2 голосов
/ 07 октября 2009

В .NET все классы являются ссылочными типами, и ссылка всегда передается ... по ссылке (текущая реализация ссылки - это указатель, который может перемещаться GC, когда это необходимо), так что вы не нужно ни о чем беспокоиться.

О событиях, параметр отправителя всегда является объектом, который сгенерировал событие (например, Button в событии Click для кнопки). Если вы хотите передать произвольные данные в пользовательском событии, наследуется от EventArgs и передает его в качестве второго аргумента.

1 голос
/ 06 января 2012

Когда параметры передаются по ссылке,

1. Свойства, присутствующие внутри ссылочного экземпляра, можно изменить, не затрагивая исходный ссылочный экземпляр.

2. Исходную ссылку можно изменить с помощью ключевого слова ref.

Ниже приведен пример

public partial class ParentForm : Form
{
    public ParentForm()
    {
        InitializeComponent();
        ChildForm childForm = new ChildForm();
        ChangeCaption( childForm );
        //Will display the dialog with the changed caption.
        childForm.ShowDialog();
        ChangeCaption( ref childForm );
        //Will give error as it is null
        childForm.ShowDialog();
    }

    void ChangeCaption( ChildForm formParam )
    {
        // This will change openForm’s display text
        formParam.Text = "From name has now been changed";
        // No effect on openForm
        formParam = null;                        
    }


    void ChangeCaption( ref ChildForm formParam )
    {
        // This will change openForm’s display text
        formParam.Text = "From name has now been changed";
        // This will destroy the openForm variable!
        formParam = null;                        
    }
}
...