首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在显式实现接口时,是否有更好的方法在C#中编写这种重复的事件声明代码?

在显式实现接口时,是否有更好的方法在C#中编写这种重复的事件声明代码?
EN

Stack Overflow用户
提问于 2010-05-06 18:20:19
回答 4查看 264关注 0票数 2

我有很多代码,如下所示,在这些代码中,我显式地实现了接口所需的一些事件。

代码语言:javascript
复制
public class IMicrowaveNotifier {
  event EventHandler<EventArgs> DoorClosed;
  event EventHandler<EventArgs> LightbulbOn;
  // ...
}

public class Microwave : IMicrowaveNotifier {
  private EventHandler<EventArgs> _doorClosed;
  event EventHandler<EventArgs> IMicrowaveNotifier.DoorClosed {
    add { lock (this) _doorClosed += value; }
    remove { lock (this) _doorClosed -= value; }
  }

  private EventHandler<EventArgs> _lightbulbOn;
  event EventHandler<EventArgs> IMicrowaveNotifier.LightbulbOn {
    add { lock (this) _lightbulbOn += value; }
    remove { lock (this) _lightbulbOn -= value; }
  }

  // ...
}

你可以看到这大部分都是样板。在Ruby中,我可以这样做:

代码语言:javascript
复制
class Microwave
  has_events :door_closed, :lightbulb_on, ...
end

在C#中有类似的更短的方法来去除这个样板吗?

更新:我在示例中遗漏了一个非常重要的部分:即实现的事件是接口的一部分,我希望显式地实现它。很抱歉之前没提到这件事!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-05-06 18:22:33

试试这个:

代码语言:javascript
复制
public class Microwave {
    public event EventHandler<EventArgs> DoorClosed;
    public event EventHandler<EventArgs> LightbulbOn;
}

这段代码利用了C#的类字段事件语法

编译类似字段的事件时,编译器会自动创建存储以保存委托,并为事件创建访问器,该事件将向委托字段添加或删除事件处理程序。

在C# 1、2和3中,这段代码将编译到上面的代码。在C# 4中,您将得到与不使用显式锁功能相当的代码。无论哪种方式,您都可以使用此快捷方式而不更改此类型的使用者。

更新:不幸的是,编译器不允许您将类似字段的事件用于显式接口实现。如果您尝试,您将得到以下编译错误:

事件的显式接口实现必须使用事件访问器语法。

更新:--遗憾的是,显式接口实现需要使用事件访问器语法。如果C#添加了创建自动实现的类似于字段的事件的功能,这将是一种很酷的做法:

代码语言:javascript
复制
event EventHandler<EventArgs> IAppliance.DoorClosed { add; remove; }

但是,这种语法已经比现有的类似字段的事件语法更加简洁,并且只适用于接口成员被显式实现的情况。我认为最好的情况是编译器只允许我们这样做:

代码语言:javascript
复制
event EventHandler<EventArgs> IAppliance.DoorClosed;
票数 10
EN

Stack Overflow用户

发布于 2010-05-06 18:28:45

我不知道Lock是怎么做的,因为我是个新手,但是您可以将所有的控件或任何调用这些事件的东西连接到一个事件上。在这种情况下,只需执行一条if语句来检查是谁发送的。

我认为它看起来会整洁得多,但我想还需要做一些工作。

票数 0
EN

Stack Overflow用户

发布于 2010-05-06 18:36:43

为其编写代码片段并使用快捷方式。就像使用if,for,foreach{tab}{tab}一样。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2783420

复制
相关文章

相似问题

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