了解C#事件使用发送方对象

时间:2009-10-07 10:51:06

标签: c# events pass-by-reference

我是C#作为一种语言(来自C ++背景)的新手,我目前正在编写一个使用事件驱动API的应用程序。

主要包括注册事件/响应处理程序和启动事件监视器,然后处理这些异步事件/响应。

我对理解有点麻烦的是使用发送者对象。

我想要使用的是在发出请求(或设置监视器)时将句柄传递给具有各种结构和数据的类对象。然后在收到的响应/正在引发的事件中,我可以获取发送者对象,将其转换回预期的类类型并访问成员,进行进一步的更改等等,以便将其视为仍然是指向原始数据的指针(我希望它会是什么?)。

所以我的问题确实是,因为我在我的请求中传递一个类对象,这将是一个有效的引用,还是将它按值逐行复制,因为它实际上只是一个通用对象,我将结束在事件中我的类对象的空副本?

或者第三个选项,我可能完全在错误的轨道上,应该忘记整个事情? :)

问题是我的大脑仍然在指针模式下工作我认为......

5 个答案:

答案 0 :(得分:13)

这是一个参考。试试这段代码,了解它的工作原理:

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

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

如果object未通过引用传递,textBox1将保留您输入的任何文字。

答案 1 :(得分:7)

我不知道我完全理解你的问题。但要部分回答你:

您将获得对象的引用。

答案 2 :(得分:2)

在.NET中,所有类都是引用类型,并且引用总是通过引用传递(引用的当前实现是指针可以在需要时由GC移动),所以你不必担心任何事情。

关于事件,sender参数始终是生成事件的对象(例如,按钮上Button事件中的Click。如果要在自定义事件中传递任意数据,请从EventArgs继承并将其作为第二个参数传递。

答案 3 :(得分:1)

参数通过引用传递时,

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;                        
    }
}

答案 4 :(得分:0)

请注意:如果您有多个导致相同方法的控件,则可以使用

((Control)sender)

为每个控件访问它,而不管控件的类型是什么(上面只是硬写,必须是什么对象)