2

有人可以解释事件如何为访问委托提供封装,而不是您不能使用赋值=运算符,而只能使用+=and -=。我不明白的部分是这样的:

public delegate void CarEngineHandler(string msgForCaller);

public CarEngineHandler listOfHandlers;

如果是这样public,那么我们可以这样做listOfHandlers.invoke("hello");。我明白了,但是事件如何提供封装?

public events CarEngineHandler listOfHandlers;

listOfHandlers("hello"); //fire the event

不是随时触发事件并调用代表吗?封装在哪里?

4

2 回答 2

3

Events只能由提供它们的类触发。您可以订阅一个类的公共事件,但不能从不同的类触发它。

有关事件,请参阅MSDN 。

于 2013-03-18T20:24:50.663 回答
0

事件通过允许对事件的响应发生在对象之外来提供封装,而对象仍然不知道该信息。

class A
{
    private event Action _event;
    public event Action Event { add { _event += value; } remove { _event -= value; } }
    int counter = 0;
    public void AddOne()
    {
        counter++;
        if (counter > 0)
        {
            OnEvent();
        }
    }
    private void OnEvent()
    {
        if (_event != null)
            _event();
    }
}
class Program
{
    int Main()
    {
        string outsidestring = "THE CLASS HAS NO IDEA WHO I AM";
        A a = new A();

        a.Event += new Action(()=>Console.WriteLine(outsidestring));

        while (true)
        {
            Console.ReadLine();
            a.AddOne();
        }
    }
}

在此示例中,当 A 的计数器达到 10 时,它可以对外部字符串执行某些操作,而无需了解外部字符串的任何信息。

于 2013-03-18T20:30:18.547 回答