6

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

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

我有点难以理解的是发送者对象的使用。

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

所以我的问题真的是,当我在请求中传递一个类对象时,这将是一个有效的引用,还是会按值复制它,因为它实际上只是一个通用对象,我最终会得到一个事件中我的类对象的空副本?

或者第三个选项,我可能完全走错了路,应该忘记整件事?:)

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

4

5 回答 5

16

这是一个参考。试试这段代码,看看它是如何工作的:

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

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

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

于 2009-10-07T11:00:00.883 回答
7

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

您将获得对您的对象的引用。

于 2009-10-07T10:54:17.353 回答
2

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

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

于 2009-10-07T10:56:53.087 回答
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;                        
    }
}
于 2012-01-06T06:14:00.320 回答
1

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

((Control)sender)

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

于 2020-01-24T19:57:34.563 回答