何为委托
加了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();
区别如下
不能被初始化和外部调用,这是一种权限控制的安全机制
PS
委托尽量不要自己去实现,一方面是官方已经提供了Func与Action两种有无返回的委托,基本够用;另一方面是,委托是一种类型,如果委托的类型过多,会造成泛滥且不能够通用
进阶
出自:博客园-半路独行
原文地址:http://www.cnblogs.com/banluduxing/p/8999428.html
本文出自于http://www.cnblogs.com/banluduxing 转载请注明出处。