C#中的委托和事件
2021-06-27 01:06
标签:模式 lam out method code fat col summary lambda C#中的委托是一种类型,是方法的一种抽象,事件是一种特殊的委托。 区别在于:委托可以直接赋值和调用,而事件只能在外部进行赋值和调用,事件在外部只能用+=进行订阅。 委托的几种调用方式: NoReturnWithPara method = new NoReturnWithPara(ShowPlus); //实例化委托 // method(3,4); //method.Invoke(3,4); //method.BeginInvoke(3,4,null,null); //异步调用 多播委托是不能异步调用的,多播委托用+=,-=去添加和移除多个方法,但是lambda表达式(匿名方法)是移除不了的。 委托和事件的区别,发布订阅模式(观察者模式),猫叫,老鼠跑,小孩哭,大人醒。 C#中的委托和事件 标签:模式 lam out method code fat col summary lambda 原文地址:https://www.cnblogs.com/zhumeiming/p/10088340.html多播委托带返回值,结果是最后那个方法的。
public class MyDelegate
{
public delegate void NoReturnNoPara();
public delegate void NoReturnWithPara(int x,int y); //声明委托
public void Show()
{
NoReturnWithPara method = new NoReturnWithPara(ShowPlus); //实例化委托
// method(3,4);
//method.Invoke(3,4);
//ShowPlus(3,4);
//method.BeginInvoke(3,4,null,null); //异步调用
//多播委托
method += ShowPlus;
method += (x, y) => Console.WriteLine("我是{0}和我得啥{1}",x,y);
method += ShowPlusStatic;
method += ShowPlusStatic;
method += ShowPlusStatic;
method -= ShowPlus;
method -= ShowPlusStatic;
//lambda表达式(匿名方法)是无法移除的。
method -= (x, y) => Console.WriteLine("我是{0}和我得啥{1}", x, y);
method(7,8);
// method.BeginInvoke(7,8,null,null); //多播委托是不能异步的
Funcstring, int> func = s => s.Length;
func += s => s.Length + 2;
func += s => s.Length + 3;
func += s => s.Length + 1;
int iResult = func("Zain"); //5 多播委托带返回值,结果是最后那个方法的。
}
public void ShowPlus(int x,int y)
{
Console.WriteLine("打印x,和y的值{0},{1}",x,y);
}
public static void ShowPlusStatic(int x, int y)
{
Console.WriteLine("static打印x,和y的值{0},{1}", x, y);
}
}
///
class Program
{
static void Main(string[] args)
{
MyDelegate md = new MyDelegate();
md.Show();
Greeting greeting = new Greeting();
//greeting.SayHi("zain",Greeting.PeopleType.Chinese);
//greeting.SayHi("Eleven", Greeting.PeopleType.Buluo);
Actionstring> act = new Actionstring>(greeting.SayHiChinese);
greeting.SayHiDelegate("zain",act);
{
Cat cat = new Cat();
cat.Miao();
Console.WriteLine("******************************Delegate****************");
cat.CatMiaoHandler = () => Console.WriteLine("这里是Delegate"); //直接给委托赋值
cat.CatMiaoHandler += new Neighbor().Awake;
cat.CatMiaoHandler += new Mouse().Run;
cat.CatMiaoHandler += new Dog().Wang;
cat.CatMiaoHandler += new Baby().Cry;
cat.CatMiaoHandler += new Father().Shout;
cat.CatMiaoHandler += new Mother().Whiper;
cat.CatMiaoHandler.Invoke(); //直接调用委托
cat.MiaoDelegate();
}
{
Cat cat = new Cat();
cat.Miao();
Console.WriteLine("******************************Event****************");
// cat.CatMiaoHandlerEvent = () => Console.WriteLine("这里是Event"); //外部不能直接给事件赋值
cat.CatMiaoHandlerEvent += new Neighbor().Awake; //事件的订阅
cat.CatMiaoHandlerEvent += new Mouse().Run;
cat.CatMiaoHandlerEvent += new Dog().Wang;
cat.CatMiaoHandlerEvent += new Baby().Cry;
cat.CatMiaoHandlerEvent += new Father().Shout;
cat.CatMiaoHandlerEvent += new Mother().Whiper;
// cat.CatMiaoHandlerEvent() //外部不能直接调用事件
cat.MiaoEvent();
}
Console.ReadKey();
}
}