第510篇-Delegate和Event异同--(内容篇6:共6篇)

有没有办法像使用属性一样来完成上面的例子呢(如何让事件只允许一个客户订阅)?答案是有的,C#中提供了一种叫事件访问器(Event Accessor)的东西,它用来封装委托变量.

代码逻辑:

namespace DelegateEventDemo
{
    class Class4
    {
        static void Main1(string[] args)
        {
            Publishser pub = new Publishser();

            Subscriber1 sub1 = new Subscriber1();
            Subscriber2 sub2 = new Subscriber2();

            pub.NumberChanged -= sub1.OnNumberChanged; // 不会有任何反应

            pub.NumberChanged += sub2.OnNumberChanged; // 注册了sub2
            pub.NumberChanged += sub1.OnNumberChanged; // sub1将sub2的覆盖掉了
            pub.DoSomething();          // 触发事件
        }
    }
    // 定义委托
    public delegate string GeneralEventHandler();

    // 定义事件发布者
    public class Publishser
    {
        // 声明一个委托变量
        private GeneralEventHandler numberChanged;
        // 事件访问器的定义
        public event GeneralEventHandler NumberChanged
        {
            add
            {
                numberChanged = value;
            }
            remove
            {
                numberChanged -= value;
            }
        }
        public void DoSomething()
        {
            // 做某些其他的事情
            if (numberChanged != null)
            {    // 通过委托变量触发事件
                string rtn = numberChanged();
                Console.WriteLine("Return: {0}", rtn);      // 打印返回的字符串
            }
        }
    }

    // 定义事件订阅者
    public class Subscriber1
    {
        public string OnNumberChanged()
        {
            Console.WriteLine("Subscriber1 Invoked!");
            return "Subscriber1";
        }
    }

    // 定义事件订阅者
    public class Subscriber2
    {
        public string OnNumberChanged()
        {
            Console.WriteLine("Subscriber1 Invoked!");
            return "Subscriber1";
        }
    }
}

注意,因为subseribe2的值被subscribe1重写了,所以不会被调用.

posted @ 2013-03-04 18:14  Shanghai Jim Zhou  阅读(165)  评论(0编辑  收藏  举报