我是C#作为一种语言(来自C ++背景)的新手,我目前正在编写一个使用事件驱动API的应用程序。
主要包括注册事件/响应处理程序和启动事件监视器,然后处理这些异步事件/响应。
我对理解有点麻烦的是使用发送者对象。
我想要使用的是在发出请求(或设置监视器)时将句柄传递给具有各种结构和数据的类对象。然后在收到的响应/正在引发的事件中,我可以获取发送者对象,将其转换回预期的类类型并访问成员,进行进一步的更改等等,以便将其视为仍然是指向原始数据的指针(我希望它会是什么?)。
所以我的问题确实是,因为我在我的请求中传递一个类对象,这将是一个有效的引用,还是将它按值逐行复制,因为它实际上只是一个通用对象,我将结束在事件中我的类对象的空副本?
或者第三个选项,我可能完全在错误的轨道上,应该忘记整个事情? :)
问题是我的大脑仍然在指针模式下工作我认为......
答案 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)
为每个控件访问它,而不管控件的类型是什么(上面只是硬写,必须是什么对象)