理解C#事件使用发送方对象 P> >我对C语言(C++背景)相当有新意,目前正在编写一个应用程序,该程序使用事件驱动API。

理解C#事件使用发送方对象 P> >我对C语言(C++背景)相当有新意,目前正在编写一个应用程序,该程序使用事件驱动API。,c#,events,pass-by-reference,C#,Events,Pass By Reference,这主要包括注册事件/响应处理程序和启动事件监视器,然后处理这些非同步事件/响应 我在理解发送方对象时遇到了一点困难 我想使用它的目的是在发出请求(或设置监视器)时,将句柄传递给具有各种结构和数据的类对象。然后,在收到响应/引发事件时,我可以将发送者对象转换回预期的类类型和访问成员,进行进一步的更改等。因此,将其视为指向原始数据的指针(我希望它是?) 所以我的问题是,当我在我的请求中传递一个类对象时,这是一个有效的引用,还是它会被值复制到某个地方,因为它实际上只是一个泛型对象,我会在事件中得到一个

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

我在理解发送方对象时遇到了一点困难

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

所以我的问题是,当我在我的请求中传递一个类对象时,这是一个有效的引用,还是它会被值复制到某个地方,因为它实际上只是一个泛型对象,我会在事件中得到一个空的类对象副本

或者第三种选择,我可能完全走错了方向,应该忘记整件事吗?:)


问题是我的大脑仍然在指针模式下工作,我想…

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


您将获得对对象的引用。

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


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

这是一个引用。请尝试此代码以了解其工作原理:

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

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

如果对象未通过引用传递,
textBox1
将保留您在其中键入的任何文本。

当参数通过引用传递时

一,。可以更改引用实例中存在的属性,而不会影响原始引用实例

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

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

((Control)sender)

要为每个控件访问它,无论控件的类型如何(上面的控件只是硬写的,它必须是什么对象)

这是我有点担心的一件事,我可以看到,只要请求和响应继续,我就会得到我的对象引用。但是您可以说sender参数始终是生成事件的对象。这是绝对的吗?或者可能是别的(即使不推荐)。因为我使用的API允许我启动一个传递用户对象的监视器,所以我似乎应该返回事件发送者对象,而不是生成事件本身的对象。显然,您不知道具体的实现,但您认为这可能吗?啊,不,实际上我想我知道它是什么,即返回的发送方对象带有对启动监视器本身的响应,而不是引发的后续事件。无论如何,谢谢你:)