C# 委托(Delegate)和事件(Event)
委托:是一个类,继承自System.MulticastDelegate,里面内置了几个方法。
委托可以写在类里面,也可以写在类的外面。
// 委托可以写在类的外面
public delegate void NoReturnNoParaOutClass();
public class MyDelegate
{
// 也可以写在类里面
public delegate void NoReturnNoPara<T>(T t);
public delegate void NoReturnNoPara();
public delegate void NoReturnWithPara(int x, int y);//1 声明委托
public delegate int WithReturnNoPara();
public delegate string WithReturnWithPara(out int x, ref int y);
}
委托的调用:
// 假设存在方法 DoNothing
private void DoNothing()
{
Console.WriteLine("This is DoNothing");
}
private int GetSomething()
{
return 1;
}
private int GetSomething2()
{
return 2;
}
private int GetSomething3()
{
return 3;
}
public void Show()
{
// 1. 无参数,无返回值的调用
{
//把方法包装成对象,invoke的时候自动执行方法
NoReturnNoPara method = new NoReturnNoPara(this.DoNothing);//2 委托的实例化
method.Invoke();//3 委托实例的调用
method();//等同于 method.Invoke();
// 下面是不用委托,直接调用方法
this.DoNothing();
}
// 无参数有返回值的调用
{
WithReturnNoPara method = new WithReturnNoPara(this.GetSomething);
// 获取返回值
int iResult = method.Invoke();
// 这样写也可以
iResult = method();
//异步调用方式
var result = method.BeginInvoke(null, null);
// 当使用BeginInvoke异步调用方法时,如果方法未执行完,EndInvoke方法就会一直阻塞,直到被调用的方法执行完毕。
method.EndInvoke(result);
}
//多种途径实例化
{
{
// 传递当前实例的普通方法
NoReturnNoPara method = new NoReturnNoPara(this.DoNothing);
}
{
// 传递当前实例的静态方法
NoReturnNoPara method = new NoReturnNoPara(DoNothingStatic);
}
{
// 传递外部的静态方法
NoReturnNoPara method = new NoReturnNoPara(Student.StudyAdvanced);
}
{
// 传递外部的方法
NoReturnNoPara method = new NoReturnNoPara(new Student().Study)