了解C#事件使用发送方对象
我是C#作为一种语言(来自C ++背景)的新手,我目前正在编写一个使用事件驱动API的应用程序。
这主要包括注册事件/响应处理程序和启动事件监视器,然后处理这些异步事件/响应。
我理解有点麻烦的是发送者对象的使用。
我想要使用的是在发出请求(或设置监视器)时将句柄传递给具有各种结构和数据的类对象。 然后在收到的响应/正在引发的事件中,我可以获取发送者对象,将其转换回预期的类类型并访问成员,进行进一步的更改等等,以便将其视为仍然是指向原始数据的指针(我希望它会是什么?)。
所以我的问题是,当我在我的请求中传递一个类对象时,它是否实际上是一个引用,或者它将被复制到值的某个位置,因为它实际上只是一个通用对象,我最终会得到一个活动中我的class级对象的空副本?
或者第三个选项,我可能完全在错误的轨道上,应该忘记整个事情? 🙂
问题是我的大脑仍然在指针模式下工作我想…
我不知道我完全理解你的问题。 但要部分回答你:
您将获得对象的引用。
这是一个参考。 试试这段代码,了解它是如何工作的:
private void textBox1_TextChanged(object sender, EventArgs e) { Whatever(sender); } private void Whatever(object sender) { TextBox tb = (TextBox)sender; tb.Text = "yo"; }
如果object
未通过引用传递,则textBox1
将保留您键入的任何文本。
在.NET中,所有类都是引用类型,引用总是通过引用传递(引用的当前实现是一个指针,当它需要时可以由GC移动),所以你不需要不得不担心任何事情。
关于事件,sender参数始终是生成事件的对象(例如, Button
上的Click
事件中的Button
)。 如果要在自定义事件中传递任意数据,请从EventArgsinheritance并将其作为第二个参数传递。
参数通过引用传递时,
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; } }