c#中的委托和事件
1.委托
相当于c++中的函数指针 指针-->委托
方法作为参数 委托来接受 即委托指向该方法
委托作用:将方法变成和基本的数据类型一样 可以当参数传递,作为返回值,赋值等
例子:
委托声明
1)delegate void delegateFun1(int a,float b) //带参数不带返回值
2)delegate bool delegateFun2() //不带参数带返回值
3)delegate bool delegateFun3(int a,int b)//带参数和返回值
委托实例化
void fun1(int a,float b)
{
...
}
1) delegateFun1 f1=new delegateFun1(fun1)
2)delegateFun1 f2=fun1;
3)
delegateFun1 f3;
f3=fun1;
f3+=fun2;//多播委托 委托内部就是一个数组
实际上使用+=符号的时候会判断
如果此时委托还没有实例化(委托实例为null),它会自动用+=右边的函数实例化委托
如果此时委托已经实例化,它会只把+=右边的函数注册到委托实例上
匿名函数初始化委托
delegateFun3 f4 =deleagte(int a,int b){
...
};
labmda表达式 用在委托中替换匿名函数
delegateFun3 f4 =(int a,int b)=>{return a+b}
delegateFun3 f4 =(a,b)=>{return a+b}//进一步简化
泛型委托(广泛使用)
1)Action<T> //带参数无返回值的委托
2)Fun<T,TResult> //带参数必须有返回值的委托
泛型委托的使用(一般结合lambda表达式使用)
Action泛型委托原理 public delegate void Action(T)
Func泛型委托原理 public delegate TResult Func(T,out Result)
Action f5=()=>{Console.WriteLine("...");}//无参数无返回值的泛型委托
Action<int,int> f6=(int a,int b)=>{Console.WriteLine("123");}//带参数无返回值的泛型委托
Action<int,int> f7=(a,b)={...};
Func<string> f8=()=>{return "123";}//
Func<int,string> f9=(int a)=>{return "2222";};
Func<int,string,bool>=(int a,string s)=>{return true;}
2.事件
c#事件定义 public event DelegateFun checkEvent;
使用步骤: 声明事件->实例化事件->注册函数到事件
事件和委托的关系:事件就是经过封装的委托
事件使用要点
delegate void DelegateFun(int a);
1.不用判空 if(delegate!=null)
2. 不能用'='实例化只能用+=初始化 用'='会出错
3.在类的内部,无论声明是protected还是public,都是private 封装性良好,防止外部访问