2012-03-21 48 views
0

我最近一直在开发MFC和C#Windows窗体应用程序,我注意到自动生成的事件处理程序上的访问修饰符之间的区别。事件处理程序访问修饰符MFC vs C#WinForms

在MFC

public: 
afx_msg void OnBnClickedOk(); 

在C#赢表单

private void button1_Click(object sender, EventArgs e) 

所以我的问题是,为什么是事件处理程序在MFC中声明为public,我会虽然C#的方式是在技术上更好它促进封装(这也许是为什么它被改变了)。

感谢

回答

1

它一直以来我做MFC一段时间...

最终的方式,C#和MFC调度信息是不同的,同样这两者并不只是不同的语言,但完全不同的平台 - 因为仅仅是因为事件处理方法的可见性,所以说一个比另一个更好,尤其是是不正确的。没有什么能阻止你改变C#处理程序的可见性,事实上,在某些情况下,你可能需要为了伪造一个事件(尽管还有其他更适当的架构方式来实现相同的事情)。

通常情况下,表单的控件及其事件默认情况下都是自己的业务,这非常合理。同样,关于C#的默认private立场的另一个线索是在处理程序的签名中 - 它们都期望发件人和事件数据(请注意MFC不) - 如果底层控件是私有的,那么没有理由公开它或者受到保护,因为外部调用者无法向事件处理程序提供正确的参数。

在这方面,处理程序是私人的。

+0

感谢您的详细解释! – TomP89 2012-03-21 22:51:33

+0

答案很好,但我想补充一点,MFC中的事件处理程序不需要公开,它们是默认公开的。所有的调用都是通过指向这些方法的指针(MESSAGE_MAP)发生的。 – 2012-04-02 16:21:35

+0

Léo - 是的,我确实知道使用了一个函数指针表 - 我认为可见性并不重要(但我不想说因为它已经有一段时间了);我确实记得利用默认公共的优势,然后将另一个窗口的处理程序连接到一条消息,这对于复杂的UI来说很酷 – 2012-04-02 16:26:40