c#进阶之浅析委托和事件

时间:2023-12-19 22:23:20

何为委托

加了delegate关键字,没有方法体{}的方法模版(方法列表);委托是一种类型

public  void Write()
{
//TODO
}
//加上关键字delegate,去掉方法体{}
public delegate void Write();

委托的使用

委托基础使用三部曲:1初始化声明的委托 2绑定定义的方法 3使用

绑定方法与声明的委托的参数签名必须一致(参数个数,对应类型,返回类型)

 class Program
{
//定义方法
public static void WriteFun()
{
//TODO
}
public static void GetFun(int y)
{
//TODO
}
public static string SetFun()
{
return "";
}
//声明委托
public delegate void Write();
public delegate void Get(int x);
public delegate string Set(); static void Main(string[] args)
{
//初始化委托,绑定方法
Write write = new Write(WriteFun);
//可简写Write write = WriteFun;
Get get = GetFun;
Set set = SetFun;
//直接使用或者用invoke()
write();//write.Invoke();
get();//get.Invoke(3);
string str = set();//string str = set.Invoke();
}
}

多播委托

上面说过委托是方法列表:委托可以一次绑定多个方法,通过+=和-=来绑定和解除绑定;

 class Program
{
public static void WriteFun()
{
//TODO
}
public static void WriteFun1()
{
//TODO
}
public static void WriteFun2()
{
//TODO
} public delegate void Write(); static void Main(string[] args)
{
Write write = WriteFun;
write += WriteFun;
write -= WriteFun;
write += WriteFun1;
write += WriteFun2;
write.Invoke();
}
}

委托和事件

委托是一种类型,事件是加了关键字event的委托实例

相比与上述的普通委托实例,事件更加特殊,它不能被初始化,且不能被外部调用

public class Button
{ public ButtonClickHandle ButtonClickHandle;
public event ButtonClickHandle ButtonClickHandleEvent; public void click()
{
if (ButtonClickHandle !=null)
{
ButtonClickHandle.Invoke();
}
if (ButtonClickHandleEvent != null)
{
ButtonClickHandleEvent.Invoke();
}
}
}
public delegate void ButtonClickHandle();

区别如下

c#进阶之浅析委托和事件

不能被初始化和外部调用,这是一种权限控制的安全机制

PS

委托尽量不要自己去实现,一方面是官方已经提供了Func与Action两种有无返回的委托,基本够用;另一方面是,委托是一种类型,如果委托的类型过多,会造成泛滥且不能够通用

进阶

lambda表达式

出自:博客园-半路独行

原文地址:http://www.cnblogs.com/banluduxing/p/8999428.html

本文出自于http://www.cnblogs.com/banluduxing 转载请注明出处。