委托和事件 简要笔记

笔记来源于刘铁锰老师的视频讲解后自己的记录梳理,推荐看看刘铁锰老师的相关教学视频
《c#系列》《wpf系列》《MVVM系列》《对答如刘系列》
还有一个《C# WPF .NET 数据绑定和数据库开发基础(第四季) 》这个是传智播客的视频

上面的视频在b站上都有,可以自行搜索

关于委托和事件的一些语法啊,声明方式啊,相关触发事件的逻辑啊,大家可以看看相关源码
https://referencesource.microsoft.com
这个网站可以看相关源码,没事可以翻翻。

1,委托
关于Action和Fun<>就不说了
一个delegate简单例子

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication4
{
    public delegate void Test(int a, int b);
    class Program
    {
        static void Main(string[] args)
        {
            Test test = null;//在这里声明了一个委托类型的变量
            Apple apple = new Apple();
            test += apple.add;//使用 += 来将apple.add函数放在这个委托变量中
            test(1, 2);//通过委托变量来简介调用apple.add函数
        }
    }
    class Apple
    {
        public void add(int a, int b)
        {
            Console.WriteLine(a+b);
        }
    }
}

就这。。。。声明委托类时注意和相对应的函数一样一样的。。。

关于事件

在这里插入图片描述
先作下个人表达理解:
事件的定义其实就是微软设计的一种C#语法的规范,这个语法规则封装了(或者说关联了)Windows消息,委托
其作用:清晰理解、安全操作
而激发事件------其实就是激发委托来间接的调用响应函数

(要不你还是看看刘铁锰的视频吧、、、、它说的比较好。。)
https://www.bilibili.com/video/av7606481/?p=22

关于事件,我们以上图模式来说明(我意思是关于事件也有其他模式,只是对象位置的关系)

1,首先对象A中有个事件(关于事件的定义,要不你们还是看看视频中的说法吧。。。我反正不太愿意听这些概览。。。怕听不好。。)
2,将对象B和对象A进行关联(对象B来订阅对象A的事件)
3,然后这个事件需要有逻辑来触发(当你实际编写关于自定义事件的程序时,你就会发现这里其实就是通过委托来调用响应函数)
在3中这个响应函数其实就和委托关联了,同时事件也和委托关联了 (委托规定了响应函数的格式),在这个格式中(即形参中有对象A和相关消息)
4,然后响应函数就开始执行了。。。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Deployment.Internal;
using System.Dynamic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading;

namespace ConsoleApplication3
{
   
    public delegate void OrderEventHandler(Customer senderCustomer, OrderEventArgs eventArgs);
    //1,如此命名让别人一看就知道 这个委托是用来声明事件的 反过来说:我们要自定义一个事件就需要先声明一个委托
    //2,同时这个委托也会来约束事件处理器
    //3,这个委托的实例时用来存储事件处理器

    class Program
    {
        static void Main(string[] args)
        {
            Customer customer = new Customer();
            Waiter waiter = new Waiter();
            customer.Order += waiter.action;
            customer.action();
   
            customer.PayTheBill();

            Console.ReadLine();
        }
    }

    public class Customer
    {

        private OrderEventHandler orderEventHandler;

        public event OrderEventHandler Order//声明一个事件!
        {
            add
            {
                this.orderEventHandler += value;
            }
            remove 
            {
                this.orderEventHandler -= value;
            }
        }
        
        public void WalkIn()
        {
        Console.WriteLine("walkin....");
        }

        public void SitDown()
        {
        Console.WriteLine("sitdown....");
        }

        public void Think()
        {

            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine("thing...");
                Thread.Sleep(1000);
            }
            
           //经过前面一堆有的没的事情后,开始触发事件了。。。
            if (this.orderEventHandler != null)//没人订阅这个事件,没有事件处理器来处理这个事件
            {
                OrderEventArgs e= new OrderEventArgs();
                e.DishName ="rou";
                e.Size = "large";
                this.orderEventHandler(this, e);//这里不就是通过委托来间接的调用响应函数吗,所以这里与其说想办法来触发事件,不如说想办法来通过委托变量来间接的调用相应函数
            }
            /////////////////////////////
        }

        public void action()
        {
            Console.ReadLine();
            this.WalkIn();
            this.SitDown();
            this.Think();
        }

        public double Bill { get; set; }//要付的钱

        public void PayTheBill()
        {
            Console.WriteLine("I will pay ${0}" ,Bill);
        }
    }

    public class OrderEventArgs:EventArgs
    {
        public string DishName { get; set; }
        public string Size { get; set; }
    }

    class Waiter
    {
        public void action(Customer senderCustomer, OrderEventArgs eventArgs)
        {
            // Customer sendercustomer = sender as Customer;
            //OrderEventArgs eventargs = e as OrderEventArgs;
            Console.WriteLine("I will server you the dish- {0}", eventArgs.DishName);
            double price = 10;

            switch (eventArgs.Size)
            {
                case "small":
                    price = 5;
                    break;

                case "large":
                    price = 15;
                    break;
                default:
                    break;
            }
            senderCustomer.Bill += price;
        }      
    }
}

`
大家去看看链接中的视频吧,个人讲不好。。。作为记录用







猜你喜欢

转载自blog.csdn.net/qq_37627370/article/details/83217285
今日推荐