我最近在一家使用C#进行大部分编程的公司完成了为期6个月的实习。在这段时间里,我第一次使用并习惯了C#做事件的方式。如下所示:
acc.AccountBalanceLow += new AccountBalanceDelegate(atm.AccountToLow);
acc.AccountBalanceLow +=new AccountBalanceDelegate(atm.AccountToLowAgain);
D是否支持这样的结构?我想可以通过使用运算符重载来创建一个,但我不完全确定。如果不可能的那么,那么什么是常见的例外方式呢?
答案 0 :(得分:11)
D中的等效构造是使用Signals and Slots。这是实现Observer Pattern的另一种方法,它实际上是C#事件的作用。
答案 1 :(得分:4)
D(和C ++)使用名为signals and slots的类似模式。
答案 2 :(得分:1)
如果你觉得需要使用C#style-events而不是信号和插槽,那么它们实现起来非常简单:
module fluidity.core.event;
class Event {
alias void delegate(EventArgs) handler_t;
handler_t[] handlers;
Object owner;
this() {}
this(Object o) { owner = o; }
void attach(handler_t handler) {
if (handler)
handlers ~= handler;
}
void detach(handler_t handler) {
int i = -1;
foreach (j, h; handlers)
{
if (h is handler)
{
i = j;
break;
}
}
if (i > -1)
handlers = handlers[0..i] ~ handlers[i+1..$];
}
void raise() { raise(new EventArgs(owner)); }
void raise(EventArgs e) {
// call all handlers
foreach (handler; handlers)
{
if (handler)
handler(e);
}
}
void opAddAssign(handler_t handler) {
attach(handler);
}
void opSubAssign(handler_t handler) {
detach(handler);
}
}
class EventArgs {
Object source;
bool handled;
void handle() { handled = true; }
this() {}
this(Object s) {
source = s;
}
}
答案 3 :(得分:1)
以下是使用信号,插槽和模板的c#样式事件的示例:
events.d:
import std.signals;
class Event(T...){
mixin Signal!(T);
void broadcast(T args){
emit(args);
}
void opAddAssign(slot_t slot){
connect(slot);
}
void opSubAssign(slot_t slot) {
disconnect(slot);
}
}
声明:
public Event!(int) onSomeEventOfInt;
public Event!(string, int) onSomeEventOfStringAndInt;
实例:
this.onSomeEventOfInt = new Event!(int)();
this.onSomeEventOfStringAndInt = new Event!(string, int)();
火灾事件:
int i = 4;
string str = "hello";
this.onSomeEventOfInt.broadcast(i);
this.onSomeEventOfStringAndInt.broadcast(str, 4);
观察员注册:
obj1.onSomeEventOfInt += &handleEventOfInt
obj1.onSomeEventOfStringAndInt += &handleEventOfStringAndInt
void handleEventOfInt(int g)
{ /*do something */ }
void handleEventOfStringAndInt(string str, int g)
{ /*do something */ }
答案 4 :(得分:0)
查看DFL的赛事系统。它的工作方式与C#.NET完全相同。
下载DFL,抓住事件模块并按照您喜欢的方式使用它。我修改它以使用可变参数模板参数。这提供了最大的灵活性。