【---------------为什么不能编译this.Load(null, null)----------------------】

BenBenBears 2017-02-04 09:41:09
自定义事件

event EventHandler PrintEventHandle;

PrintA事件

private void PrintA(object sender, EventArgs e)
{
Console.WriteLine("A");
}


挂载

PrintEventHandle += PrintA;


调用

PrintEventHandle(null,null);


以上编译没问题,但编译执行以下代码

this.Load(null, null);


提示错误:事件“System.Windows.Forms.Form.Load”只能出现在 += 或 -= 的左边

为什么自己定义的事件能直接调用,系统的不可以?

...全文
178 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 楼主 BenBenBears 的回复:
调用

PrintEventHandle(null,null);
以上编译没问题,但编译执行以下代码

this.Load(null, null);
如果你声明为 EventHandler PrintEventHandle;,也就是删除 event 关键字,你会发先这个委托仍然可以 +=,仍然可以调用。但是外部的随便模块都可以给这个委托赋值(=号赋值),也就是说可以随便胡乱修改它。这样就违背了事件机制的安全规则,会产生编程设计错误。 event 关键字帮你对事件进行保护,编译器保证外部的模块不能随便修改(例如=号赋值)委托,也不能直接调用委托(只有声明它的对象才能触发它)。保证了安全,给你在编译时检查出来编程设计错误。
Poopaye 2017-02-04
  • 打赏
  • 举报
回复
引用 3 楼 xuzuning 的回复:
System.Windows.Forms.Form.Load 是 OnLoad 事件的桩,不是方法
多谢指正
xuzuning 2017-02-04
  • 打赏
  • 举报
回复
System.Windows.Forms.Form.Load 是 OnLoad 事件的桩,不是方法
Poopaye 2017-02-04
  • 打赏
  • 举报
回复
事件只能由定义它的类来调用,哪怕是继承下来的也不可以。 不过windows控件的事件XXX一般都带有一个叫OnXXX的方法,可以用来手动触发。
xiaoyu5425 2017-02-04
  • 打赏
  • 举报
回复
自己建一个form,找到load事件,看下怎么绑定的
BenBenBears 2017-02-04
  • 打赏
  • 举报
回复
引用 2 楼 shingoscar 的回复:
事件只能由定义它的类来调用,哪怕是继承下来的也不可以。 不过windows控件的事件XXX一般都带有一个叫OnXXX的方法,可以用来手动触发。
谢谢,原来继承也是不可以直接调用的。 查阅了资料,OnXXX方法是为了在派生类中引发基类事件,分享如何:在派生类中引发基类事件(C# 编程指南) 摘抄如下: 在创建可用作其他类的基类的类时,应考虑如下事实:事件是特殊类型的委托,只可以从声明它们的类中调用。 派生类无法直接调用基类中声明的事件。 尽管有时需要事件仅由基类引发,但在大多数情形下,应该允许派生类调用基类事件。 为此,您可以在包含该事件的基类中创建一个受保护的调用方法。 通过调用或重写此调用方法,派生类便可以间接调用该事件。
BenBenBears 2017-02-04
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
event 关键字帮你对事件进行保护,编译器保证外部的模块不能随便修改(例如=号赋值)委托,也不能直接调用委托(只有声明它的对象才能触发它)。保证了安全,给你在编译时检查出来编程设计错误。
谢谢,对event关键字的理解加深了不少。

110,476

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧