zoukankan      html  css  js  c++  java
  • 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表达式的方式了,好,你懂了吧

  • 相关阅读:
    面试汇总-待整理
    javaWeb2之Jsp
    Spring常用注解
    消费者、生产者模型
    网络知识之http请求
    设置Centos时间
    安装hive
    在Ubuntu上安装mysql(5.17.19)
    rabbitmq学习——主题路由
    rabbitmq学习——routingkey
  • 原文地址:https://www.cnblogs.com/wangchuang/p/2982082.html
Copyright © 2011-2022 走看看