我经常想写这样的东西:
new Form
{
Text = "Caption",
Controls =
{
new Button { Text = "Button 1", Click = (s, e) => MessageBox.Show("Button 1 Clicked"), Location = new Point(10, 10) },
new Button { Text = "Button 2", Click = new EventHandler(Button2Clicked), Location = new Point(10, 40) },
new Button { Text = "Button 3", Click = Button3Clicked, Location = new Point(10, 70) },
},
}
Run Code Online (Sandbox Code Playgroud)
初始化器语法只是糖,所以为什么编译器不能弄清楚如何为事件订阅生成代码?
给我一些糖,宝贝!
当发明初始化语法时,有人必须考虑事件并拒绝它们.我一直试图想象理由可能是什么,而且我是空白的.
是因为事件是一个可能有多个订阅者的多播对象吗?不,这是一个初始化过程; 没有其他订阅者.[更新]不正确,初始化程序在构造后应用,对象可以订阅自己的事件.
Eric的一个注释:我听说过为什么C#没有实现X特效.在这种情况下,有人已经在那里,实现初始化器.
更新
似乎存在争用/混淆,因为我Click =在我的例子中使用过.实际语法与问题无关.它可以很容易地通过Click +=哪种镜像来正常添加处理程序.我更喜欢前者,因为它与初始化器语法的其余部分一致,但最终我并不关心,只要我能订阅初始化列表中的事件.
另一个更新
我确实意识到现在添加该功能可能不太可能.想到的第一个问题是Intellisense必须更新.现在可能有很多其他因素会妨碍添加此功能.我的问题是:他们为什么不首先添加它.肯定有一些令人信服的东西可以保证"不可能"的投票.
我看不出有什么理由说他们不能提供这小茶匙糖,我猜他们只是没有!
事件中已经有相当多的语法糖,如果只是在没有提供自己的实现的情况下在类上声明一个事件,编译器就会为你提供一个委托支持字段,以及添加/删除'方法'实现.此外,当您添加事件处理程序时,编译器使用委托推理,允许您简单地指向方法,而不是创建表示方法的委托.
有趣的是,Mono C#允许您在对象初始值设定项中添加事件处理程序:
http://tirania.org/blog/archive/2009/Jul-27-1.html
是时候切换到Mono ;-)
| 归档时间: |
|
| 查看次数: |
4855 次 |
| 最近记录: |