C#喜欢D编程语言中的事件

时间:2011-01-26 23:56:45

标签: events d

我最近在一家使用C#进行大部分编程的公司完成了为期6个月的实习。在这段时间里,我第一次使用并习惯了C#做事件的方式。如下所示:

acc.AccountBalanceLow += new AccountBalanceDelegate(atm.AccountToLow);
acc.AccountBalanceLow +=new AccountBalanceDelegate(atm.AccountToLowAgain);

D是否支持这样的结构?我想可以通过使用运算符重载来创建一个,但我不完全确定。如果不可能的那么,那么什么是常见的例外方式呢?

5 个答案:

答案 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 Event Example

下载DFL,抓住事件模块并按照您喜欢的方式使用它。我修改它以使用可变参数模板参数。这提供了最大的灵活性。

http://www.dprogramming.com/dfl098.zip