using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Csharp委托和事件详解
{
/*
* 作者:Ai
* 时间:2018.3.1
*
* ps:委托和事件我已经学习了好几遍了,但隔得时间长了总是又忘记,
* 今晚突然想写点什么,看了一眼目录,发现委托和事件已经忘得差不多了,
* 所以就写了下文,希望在以后自己能尽快的回想起来自己曾经的学习过程。
*
*/
class Program
{
/*
* 0.什么是委托?
* 委托是对一类方法的封装
*/
//1.声明一个委托类型(注意:委托的层次级别相当于 枚举或结构体 不能在方法中声明委托类型
public delegate void MyDelegateHandler();//这是一个代表无参数无返回值的方法的委托
//6.声明一个带参数的委托类型(返回值和参数都为string
public delegate string MyDelegateHandler_String(string str);
//11.声明一个object参数的委托类型用于委托逆变
public delegate void MyDelegateHandler_Object(object c);
//12.声明一个泛型委托类型(表示一系列泛型类型和参数类型一致的方法
public delegate void MyDelegateHandler<T>(T t);
static void Main(string[] args)
{
//3.声明一个委托类型实例,在构造中为他传递一个匹配的方法
//注:这样就做到了将方法像方法参数一样传递给委托对象
MyDelegateHandler myDelegateHandler = new MyDelegateHandler(new Program().FunA);//相当于用myDelegateHandler 来指代FunA
//4.调用委托(像方法一样调用
myDelegateHandler();
//5.同理我们可以传递其他匹配的方法
myDelegateHandler = new MyDelegateHandler(new Program().FunAA);
myDelegateHandler();
//7.带参数的委托
string str = new MyDelegateHandler_String(new Program().FunB)("Hello,Delegate");
Console.WriteLine(str);
//8.多播委托(一个委托对象可以绑定多个匹配方法
myDelegateHandler = null;//将myDelegateHandler清空
myDelegateHandler = new Program().FunAA;//可以使用=绑定方法
myDelegateHandler += new Program().FunA;//第一个以后的方法使用+=绑定
myDelegateHandler();//执行委托(会按照绑定顺序依次执行
myDelegateHandler -= new Program().FunAA;//解除绑定
//9.委托逆变
//在有些时候我们不知道参数的具体类型,则通过object类型的参数,内部is判断来动态装箱拆箱
new MyDelegateHandler_Object(new Program().FunC)(100);
new MyDelegateHandler_Object(new Program().FunC)("Hello,MyDelegateHandler_Object委托");
new MyDelegateHandler_Object(new Program().FunC)(new Program());
//12.泛型委托
//尽管普通委托已经可以代表一个类型的方法,但某些时候我们需要一种委托就能代表一系列的方法
new MyDelegateHandler<Boolean>(new Program().FunD)(3 > 4 ? true : false);//3 > 4 ?true:false为三元运算符
//13.可以绑定泛型方法
new MyDelegateHandler<int>(new Program().FunDD<int>)(10);
//14.委托可以嵌套(委托绑定委托
new MyDelegateHandler(new MyDelegateHandler(new Program().FunA))();
//15.委托也可以被继承
Console.ReadKey();
}
//2.定义一个可以被委托代理的同类方法(在这里就是无参数,无返回值
void FunA()
{
Console.WriteLine("执行方法A");
}
void FunAA()
{
Console.WriteLine("执行方法AA");
}
string FunB(string str)
{
return str;
}
//10.逆变方法
void FunC(object c)
{
//通过is判断类型
if (c is int)
{
Console.WriteLine("输入的int值为 " + c);
}
else if (c is string)
{
Console.WriteLine("输入的string值为 " + c);
}
//不符合
else
{
Console.WriteLine("输入类型无法识别");
}
}
void FunD(bool a)
{
Console.WriteLine("执行方法D,值=" + a);
}
void FunDD<T>(T t)
{
Console.WriteLine("执行泛型方法");
}
}
}
输出打印结果: