首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用初始化器语法初始化事件

使用初始化器语法初始化事件
EN

Stack Overflow用户
提问于 2011-01-20 19:49:24
回答 2查看 5.4K关注 0票数 7

我经常想写这样的东西:

代码语言:javascript
复制
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) },
    },
}

初始化器语法只是白糖,那么为什么编译器不能知道如何为事件订阅生成代码呢?

给我点糖,宝贝!

当初始化器语法被发明时,一定有人考虑过事件并拒绝它们。我一直在试着想象这个理由可能是什么,现在我正处于空白之中。

是因为事件是一个可能有多个订阅者的多转换对象吗?不,这是一个初始化过程;不能有其他订户。更新的不为真,初始化器在构造后应用,对象可以订阅自己的事件

给Eric的一个注释:我听说过为什么C#不实现特性X的演讲。在这种情况下,有人已经在那里,实现了初始化器。

更新的

由于在我的示例中使用了Click =,所以似乎出现了争用/混淆。实际语法与问题无关。它也可以很容易地成为Click +=,它反映了您通常必须添加处理程序的方式。我更喜欢前者,因为它与初始化器语法的其余部分是一致的,但最终我并不在意,只要我能够订阅初始化程序列表中的事件。

另一个更新

我确实意识到现在添加这个特性可能是不太可能的。想到的第一个问题是,Intellisense必须更新。可能还有许多其他的因素会阻碍现在添加这个特性。我的问题是:为什么他们一开始不加。一定有什么很有说服力的东西让“不”的选票变了。

EN

回答 2

Stack Overflow用户

发布于 2011-01-20 20:19:48

尝试简单地分配一个事件:

代码语言:javascript
复制
Click = (o,e) => { <CODE> }

不起作用。初始化器只适用于您可以直接分配的东西。这是因为事件需要能够通知任何他们想要的人(您不应该被允许删除其他人的注册为该事件的意外)。

我不确定这是不是他们的推理,但这对我有用。

票数 2
EN

Stack Overflow用户

发布于 2013-04-02 22:17:47

是的,应该是语言的一部分!

但是,这里有一个棘手的解决方法,可以让您订阅初始化程序列表中的事件.

代码语言:javascript
复制
public class TestClass
{
    public class MyButton : Button
    {
        public EventHandler ClickSubscriber
        {
            get { return null; }
            set { Click += value; }
        }
    }

    public static void RunTest()
    {
        new Form
            {
                Text = "Caption",

                Controls =
                    {
                        new MyButton 
                            { 
                                ClickSubscriber = (s, e) => 
                                     MessageBox.Show("Button 1 Clicked"), 
                            },
                    },
            };
    }        
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4751837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档