• 委托


    什么是委托?

    安全的函数指针

    系统委托Func、Action前者有返回值,后者没有

     public delegate void Del();
        public delegate string DelStr(string name);
        class Program
        {
            static string Name = string.Empty;
            static void Main(string[] args)
            {
                //Del del = Test;
                //Del del = delegate() { };
                //=>goes to 去执行
                //Del del = () => { };
                //DelStr del = Demo;
                //DelStr del = delegate(string name) { return name; };
                DelStr del2 = (name) => { Name = name; return Name; };
                Demo("张三", del2);
                Console.ReadKey();
            }
            static void Test() { }
            static void Demo(string name,DelStr del) {
                del(name);
                Console.WriteLine(Name);
            }
        }

     事件

    class Program
        {
            static void Main(string[] args)
            {
                Eat eat = new Eat();
                eat.del += End;//绑事件,必须在触发事件之前绑定,否则事件将不被触发
                eat.EatFood("火锅涮羊肉");
                Console.ReadKey();
    
            }
            static void End()
            {
                Console.WriteLine("吃完了");
            }
        }
        public delegate void Del();//声明委托
        class Eat
        {
            public event Del del;//注册委托类型的事件,事件是一种特殊的委托
            public void EatFood(string food)
            {
                Console.WriteLine("正在吃" + food);
                Thread.Sleep(3000);//吃3秒
                if (del!=null)
                {
                    del();//如果事件不为空,触发事件
                }
            }
        }

    +=、-=多播委托

    委托是不安全的,事件就是一个类型安全的委托

    委托的作用:

      站位,在不知道将来要执行的方法的具体代码时,可以先用一个委托变量来代替方法调用(委托的返回值,参数列表要确定)。在实际调用之前,需要为委托赋值,否则为null

    事件的作用:

      事件的作用与委托一样,只是功能上比委托变量有更多的限制。(比如:1、只能通过+=或-=来绑定方法(事件处理程序)2、只能在类内部调用(触发)事件)

    事件最终形式

    class Program
        {
            static Eat eat = new Eat("火锅涮羊肉");
            static void Main(string[] args)
            {
                eat.Del += eat_Del;
                eat.EatFood();
                Console.ReadKey();
            }
            //事件绑定函数
            static void eat_Del(object sender, EventArgs e)
            {
                Console.WriteLine(eat.Food+"吃完了");
            }
        }
        class Eat
        {
            public event EventHandler Del;//声明事件
            public string Food { get; set; }
            public Eat(string food){
                this.Food = food;
            }
            public void EatFood()
            {
                Console.WriteLine("正在吃"+this.Food);
                Thread.Sleep(3000);
                if (Del != null)
                {
                    EventArgs e = new EventArgs();
                    //this事件源,此处是命名空间.类名
                    Del(this, e);
                }
            }
        }
  • 相关阅读:
    解决"从不是创建控件的线程访问它"
    (转)Asp.net 中 Get和Post 的用法
    正则表达式30分钟入门教程 v2.3 转
    winform中,如何控制控件位置随窗体的大小改变而改变
    SpringCloudNetflix(Usage of Hystrix)
    SpringCloudNetflix(Usage of Eureka)
    分布式协调Zookeeper(分布式锁&Leader选举)
    SpringCloudNetflix(Usage of GateWay)
    分布式协调Zookeeper(手写配置中心&动态刷新)
    SpringCloudNetflix(Usage of Nacos配置中心)
  • 原文地址:https://www.cnblogs.com/xiaonangua/p/7339504.html
Copyright © 2020-2023  润新知