笔记来源于刘铁锰老师的视频讲解后自己的记录梳理,推荐看看刘铁锰老师的相关教学视频
《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;
}
}
}
`
大家去看看链接中的视频吧,个人讲不好。。。作为记录用