C# 这行代码是什么?
我经常在代码中看到一行代码,我有一个想法,它可以对事件做些什么,但不清楚它是做什么的 我是否可以将表格A的加载事件附加到表格B中,或者它有什么好处C# 这行代码是什么?,c#,.net,c#-3.0,c#-2.0,C#,.net,C# 3.0,C# 2.0,我经常在代码中看到一行代码,我有一个想法,它可以对事件做些什么,但不清楚它是做什么的 我是否可以将表格A的加载事件附加到表格B中,或者它有什么好处 this.CGForm .Load +=new EventHandler(CGForm_Load); 这一行的意思是,您将方法CGForm\u Load()订阅到this.CGForm.Load事件。方法CGForm\u Load()是事件处理程序或回调 运行此行后,每次引发事件时(在本例中,每次加载表单时),都会自动调用CGForm\u Load
this.CGForm .Load +=new EventHandler(CGForm_Load);
这一行的意思是,您将方法
CGForm\u Load()
订阅到this.CGForm.Load
事件。方法CGForm\u Load()
是事件处理程序或回调
运行此行后,每次引发事件时(在本例中,每次加载表单时),都会自动调用CGForm\u Load()
要取消订阅回调,请按如下方式使用-=
:
this.CGForm.Load -= new EventHandler(CGForm_Load)
取消订阅事件回调后,下次引发事件时(如果再次加载表单),将不再调用回调
我发现以下比喻很有用:事件就像电源插座,回调就像电源插头。订阅就像把插头插到插座上,取消订阅就像拔出插头。当存在连接时,所有事件调用都会触发回调。是的,它显然与事件有关
.Load
在这种情况下,事件发生。+=
操作符向事件添加一个事件处理程序。一个事件可以同时具有多个事件处理程序。事件处理程序只是常规方法,可以位于代码库中的任何位置。当事件激发时,将依次调用所有订阅的方法
我看不出有什么特别好的理由让FormA听FormB的Load
事件,但是其他事件可能更有趣,比如这个事件。这是一种让FormA对FormB中的变化做出反应的方法
编辑请注意,这会导致FormA保留对FormB的引用,并且在FormA释放对FormB的引用(使用
this.CGForm.Load-=neweventhandler(CGForm_Load);
,注意-=
)这是.NET中内存泄漏的常见原因
订阅其他表单中的事件是一种“代码气味”,这可能是代码的潜在结构问题。在某些情况下,它是必需的,但如果到处都是,代码将很难理解和维护。它只是将GCForm\u加载方法添加到CGForm上的加载事件中。当CGForm被加载时,下面的代码将被执行。无论何时发生这种情况,都将调用所有事件订阅服务器(在本例中,这里作为CGForm_Load订阅的方法)
<pseudocode>
class CGForm
{
public EventHandler<FormLoadedEventArgs> Load;
private void SomeMethodThatLoadsTheForm()
{
LoadForm();
var loadHandlers = Load;
if (loadHandlers != null)
{
loadHandlers(new FormLoadedEventArgs(...));
}
}
}
</pseudocode>
类CGForm
{
公共事件处理程序加载;
private void somemethods加载表单()
{
LoadForm();
var loadHandlers=Load;
if(loadHandlers!=null)
{
LoadHandler(新表单LoadedEventArgs(…);
}
}
}
this.CGForm.Load+=新事件处理程序(CGForm\u Load)
将事件处理程序委托CGForm\u Load
订阅到CGForm
对象的Load
事件
有关订阅事件的文档,请访问
有关事件在.NET中如何工作的信息索引,请访问谢谢@Albin,请指导是否需要放置-=new EventHandler(),或者在执行后它会自动被垃圾收集?请解释一下“代码气味”好吗?在什么情况下可以使用此类事件,在什么情况下不应使用此类事件?感谢是代码中的某种东西,一种模式或特定构造,可能表示质量或可维护性问题。在这种情况下,“模式”是一种形式取决于另一种形式的工作方式。如果你有长链的依赖关系,你经常会遇到这样的情况:代码中某个地方的更改会破坏看似无关的地方的功能。谢谢,请告诉我一件事。要从用户控件获取消息,我应该声明一些自定义委托并获取消息,还是可以直接在我的内容页中附加用户控件的按钮甚至单击处理程序?thanks@user576510,约定是将
OnClientClick
属性设置为代码隐藏中的EventHandler
。它不需要是EventHandler
委托-它可以是与EventHandler
委托具有相同签名的方法,即void EventHandler(object sender,EventArgs e)
。这里有一个很好的教程:。有关服务器控件事件模型的更多高级信息,请访问