C#代理

虽然说的是设计模式,但是还是要补充一些知识,虽然基本用法我们都懂,但是个人觉得下面的例子更为精彩

直接看代码

 public delegate void StringAssignmentEventHandler();
    public class InvokeList
    {
        List<StringAssignmentEventHandler> handlers;
        string[] message = new string[3];
        public InvokeList()
        {
            handlers = new List<StringAssignmentEventHandler>();
            handlers.Add(AppendHello);
            handlers.Add(AppendComma);
            handlers.Add(AppendWorld);
        }
        public void Invoke()
        {
            handlers.ForEach(x => x());//代替for循环的方式
        }
        public void AppendHello()
        {
            message[0] = "hello";
            Console.WriteLine(message[0]);
        }
        public void AppendComma()
        {
            message[1] = ",";
        }
        public void AppendWorld()
        {
            message[2] = "World";
        }
        //实现索引
        public string this[int index] { get { return message[index]; } }
    }

以上虽然实现代理,但是我觉得真正要看的不是代理,这里的代理不是规范的,主要看


handlers.ForEach(x => x());//代替for循环的方式,

 public string this[int index] { get { return message[index]; } }
这么2中写法
 

好,那么微软标准代理写法怎么做呢

  public class InvokeList1
    {
        //第一次改进办法  shift+alt+alt切换全屏
        public InvokeList1()
        {
            StringAssignmentEventHandler handler = null;
            handler += new StringAssignmentEventHandler(AppendHello);
            handler += new StringAssignmentEventHandler(AppendComma);
            handler += new StringAssignmentEventHandler(AppendWorld);
            handler.Invoke();
        }

        string[] message = new string[3];

        public void AppendHello()
        {
            message[0] = "hello";
            Console.WriteLine(message[0]);
        }
        public void AppendComma()
        {
            message[1] = ",";
        }
        public void AppendWorld()
        {
            message[2] = "World";
        }
        //实现索引
        public string this[int index] { get { return message[index]; } }

你发现去掉了那个FOREach去掉了invoke方法,去掉了LIST,这样简洁多了,要是单独论简洁的话,肯定匿名方法更加简洁,那么我们再改动下

 public class InvokeList2
    {
        //再次改进,利用匿名方法
          string[] message = new string[3];
        public InvokeList2()
        {
            StringAssignmentEventHandler handler = null;
            //handler += delegate { message[0] = "hello"; };
            //handler += delegate { message[0] = ","; };
            //handler += delegate { message[0] = "world"; };
            //lamp
            handler += ()=>{ message[0] = "hello"; };
            handler += () =>{ message[1] = ","; };
            handler += () => { message[2] = "world"; };
            handler.Invoke();
        }
        //实现索引
        public string this[int index] { get { return message[index]; } }
    }

呵呵,注销的是匿名方法,直接给出了lanm表达式的方式了,好,你懂了吧

原文地址:https://www.cnblogs.com/wangchuang/p/2982082.html