Live2D

委托

什么是委托?

安全的函数指针

系统委托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);
            }
        }
    }

 

posted @ 2017-08-10 15:22  webmtjj  阅读(159)  评论(0)    收藏  举报