c#中的委托和事件

摘要:
=null)2.不能用'='实例化只能用+=初始化用'='会出错3.在类的内部,无论声明是protected还是public,都是private封装性良好,防止外部访问

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=newdelegateFun1(fun1)

2)delegateFun1 f2=fun1;

3)

delegateFun1 f3;

f3=fun1;

f3+=fun2;//多播委托 委托内部就是一个数组

实际上使用+=符号的时候会判断
如果此时委托还没有实例化(委托实例为null),它会自动用+=右边的函数实例化委托
如果此时委托已经实例化,它会只把+=右边的函数注册到委托实例上

匿名函数初始化委托

delegateFun3f4 =deleagte(int a,int b){

...

};

labmda表达式 用在委托中替换匿名函数

delegateFun3f4 =(int a,int b)=>{return a+b}

delegateFun3f4 =(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;

c#中的委托和事件第1张

使用步骤: 声明事件->实例化事件->注册函数到事件

c#中的委托和事件第2张

事件和委托的关系:事件就是经过封装的委托

事件使用要点

delegate void DelegateFun(int a);

1.不用判空 if(delegate!=null)

2. 不能用'='实例化只能用+=初始化 用'='会出错

c#中的委托和事件第3张

c#中的委托和事件第4张

c#中的委托和事件第5张

c#中的委托和事件第6张

3.在类的内部,无论声明是protected还是public,都是private 封装性良好,防止外部访问

免责声明:文章转载自《c#中的委托和事件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇java-邮件发送C#深拷贝(复制)与浅(复制)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

在c和c++中的求绝对值

在c语言中,根据类型的不同,求绝对值函数也不同。 int abs(intx) double fabs(double x) 求int类型用abs,求浮点类型用fabs。 而且这两个函数的所在头文件也不同: abs(): #include <stdlib.h> fabs(): #include <math.h> 但是,该问题在c++中...

【二分答案】洛谷P2678 [NOIP2015 提高组] 跳石头/P1824 进击的奶牛/P2440木材加工/P1873 砍树

 【跳石头】 题意:需要移掉尽可能少的石头,使得最近的两个石头距离最远。 思路:枚举会超时,二分答案。 大佬的文章写得非常清楚:https://www.luogu.com.cn/blog/user20197/solution-p2678 1 #include <iostream> 2 3 using namespace std; 4...

(转)Android之RemoteViews

RemoteViews中的setxxx方法 比如setCharSequence(int viewId, String methodName, CharSequence value); views.setString(R.id.textview01, "setText", battery + "%"); 其中views是RomoteViews的实例, 第一个...

51nod 1136 欧拉函数【数论】

1136 欧拉函数 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。此函数以其首名研究者欧拉命名,它又称为Euler's totient function、φ函数、欧拉商数等。例如:φ(8) = 4(Phi(8) = 4),因为1...

Java小项目之:教你做个开心消消乐!

Java小项目之:教你做个开心消消乐!今天给大家带来的小项目是开心消消乐(连连看),还是一样的惯例。操作简单,适合java初学者练手。想看其他java小项目的朋友可以关注我,我会持续更新,也可以私信我领资料! 这个游戏分三个模块,其中第一,二两个模块的内容都是非常分散,常常要考虑各这两大模块之间的协作,而且每个模块内部又有很多小模块,互相之间也有非常密切的...

linux C++ 共享库导出类

1.共享库的对外接口函数的声明必须加上extern “C”。 2.使用共享库对话接口函数生成的对象指针时在该对象未被释放之前不能关闭共享库句柄,否则会出现segmentation fault错误。 以下是一个插件式设计的示例: 1、主执行程序:main.cpp #include #include #include "SMSGamePlugin.h" int...