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

如何让事件只允许一个客户订阅?少数情况下,比如像上面,为了避免发生“值覆盖”的情况(更多是在异步调用方法时,后面会讨论),我们可能想限制只允许一个客户端注册。此时怎么做呢?我们可以向下面这样,将事件声明为private的, 然后提供发布者提供两个方法来进行注册和取消注册. (前一博文是subseribe.Subscribe(publisher)进行注册).

代码:

namespace DelegateEventDemo
{
    class Class3
    {
        [STAThread]
        static void Main2(string[] args)
        {
            Publishser publisher = new Publishser();
            Subscriber1 subscribe = new Subscriber1();

            publisher.Register(subscribe.OnNumberChanged);
            publisher.DoSomething();

            // unregister 
            publisher.UnRegister(subscribe.OnNumberChanged); 
            publisher.DoSomething(); // will not invoke the method
        }
    }

    public delegate string GeneralEventHandler();

    // 定义事件发布者
    public class Publishser
    {
        private event GeneralEventHandler NumberChanged;    // 声明一个私有事件
        // 注册事件
        public void Register(GeneralEventHandler method)
        {
            // 注意不是+=. 在客户端只能是+=或是-=, 但是在定义类可以是=, +=
            NumberChanged = method;
        }
        // 取消注册
        public void UnRegister(GeneralEventHandler method)
        {
            NumberChanged -= method;
        }
        public void DoSomething()
        {
            // 做某些其余的事情
            if (NumberChanged != null)
            {    // 触发事件
                string rtn = NumberChanged();
                Console.WriteLine("Return: {0}", rtn);      // 打印返回的字符串,输出为Subscriber3
            }
        }
    }

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

我们看到,unregister后的方法不会再调用:

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