3

我想知道在 c# 中事件的确切用途是什么。我仍在学习 c#,所以我可能遗漏了一些东西,但是否可以只使用委托。
在这个例子中,我编写了一个类,其方法从 0 到 2^64 计数,每次达到一千的倍数时都会引发一个事件。这是代码:

namespace EventDelegate
{
class Program
{
    static void Main(string[] args)
    {
        EventRaiserClass _eventraiser = new EventRaiserClass();
        _eventraiser.handler = SomeEventHandler;
        _eventraiser.handler += AnotherEventHandler;
        _eventraiser.Loop();
        Console.Read();
    }

    static void SomeEventHandler(object sender, EventArgs args)
    {
        Console.WriteLine("Event raised");
    }

    static void AnotherEventHandler(object sendr, EventArgs args)
    {
        Console.WriteLine("Event raised (Another handler)");
    }
}

public delegate void Handler(object sender, EventArgs args);

class EventRaiserClass
{
    public Handler handler;
    public void Loop()
    {
        for (long i = 0; i < Int64.MaxValue; i++)
        {
            if ((i % 1000) == 0)
            {
                EventArgs args = new EventArgs();
                RaiseEvent(args);
                System.Threading.Thread.Sleep(1000);
            }
        }
    }

    private void RaiseEvent(EventArgs args)
    {
        if (handler != null)
            handler(this, args);
    }
}

}

如果我将handler委托变量声明为这样的事件,会有什么不同public event Handler handler
对不起,如果我有点含糊或遗漏了一些明显的东西,但我只是想知道在使用而不是仅仅使用委托时是否在幕后发生了其他事情,event或者它是否只是为了便于阅读。

4

1 回答 1

2

事件和委托是相似的,但事件受到更多限制,这是有充分理由的。

_eventraiser.handler在您的代码中,您可以从外部执行各种操作。但是,您不应该做大部分这些事情。

考虑这一行:

_eventraiser.handler = SomeEventHandler;

如果您使用委托,则每次尝试附加事件处理程序时都必须检查委托是否为null然后使用 初始化它=,如果它不为空,则只需使用. 如果你忘记初始化,你会得到一个空引用异常,如果你输入太多,你会覆盖之前的所有东西。+=

如果在此示例中使用事件而不是委托,则不必执行任何操作,事实上,您甚至无法执行此操作。使用委托,您甚至可以接受它,然后将其传递给其他一些类,这可能非常危险。

以及您可以对委托做的所有其他事情也是如此Invoke:它们不是为事件而存在的。您可以对来自外部课程的事件做的唯一事情是+=and -=,仅此而已。您可以将它们视为具有复杂 getter 和 setter 的特殊公共接口的委托。

(事件也有一个特殊的addremove语法,但这是一个相当不常用的功能)

于 2013-04-01T11:22:09.547 回答