基础拾忆------委托详解
2016-07-21 13:29
295 查看
目录:
基础拾忆------委托详解基础拾忆------接口详解
基础拾忆------泛型详解
前言:
C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。委托是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。委托(Delegate)特别用于实现事件和回调方法。所有的委托都派生自 System.Delegate 类。把一个方法当作参数传递,让其它方法进行调用执行。好比:今天中午不想出去,委托小明帮我带份饭,我要买饭,但是小明帮我买的。
1.委托的声明
委托声明决定了可由该委托引用的方法。委托可指向一个与其具有相同标签的方法。1.1.delegate
1.1.1. 0-23个参数,可以有返回值也可以没有返回值public delegate int MyDelegateEventHandler (string parm);
注:
(1).此委托指向的方法必须是参数为string类型,返回类型为int类型的。其他声明类比所得。
(2).EventHandler是c# 命名规范,当然我理解规范就是可以随意啦。
1.1.2.委托的多播
每个委托都只包含一个方法调用,如果调用多个方法,就需要多次显示调用这个委托。如果同一个委托调用多个方法,我们就可以用多播委托
public delegate void MyDelegate (); public voidMyMethod() { //# } public void MyMethod1() { //# } public void MyMethod2() { //# } MyDelegateEnventHander myDelegate; myDelegate=new MyDelegateEventHander(MyMethod); myDelegate+=new MyDelegateEventHander(MyMethod1); ........... //调用 myDelegate();
注:
1.委托对象可使用 "+" 运算符进行合并;
2."-" 运算符可用于从合并的委托中移除组件委托;
3.委托指定方法类型必须一致;
4.返回类型一般为void,但非必须;
5.GetInvocationList获取委托索引
if (MyDelegate != null) System.Delegate[] dels = MyDelegate .GetInvocationList(); for (int i = 0; i < dels.Length; i++) { MyDelegate -= dels[i] as MethodDelegate; }
以上是利用GetInvocationList获取委托索引的一个简单应用。
1.2.Action
Action至少0个参数,至多16个参数,无返回值。Action 表示无参,无返回值的委托 Action<int,string> 表示有传入参数int,string无返回值的委托 Action<int,string,bool> 表示有传入参数int,string,bool无返回值的委托 Action<int,int,int,int> 表示有传入4个int型参数,无返回值的委托
public void Test<T>(Action<T> action,T p) { action(p); }
1.3.Func
Func至少0个参数,至多16个参数,根据返回值泛型返回。必须有返回值,不可voidFunc是无返回值的泛型委托 Func<int> 表示无参,返回值为int的委托 Func<object,string,int> 表示传入参数为object, string 返回值为int的委托 Func<object,string,int> 表示传入参数为object, string 返回值为int的委托 Func<T1,T2,,T3,int> 表示传入参数为T1,T2,,T3(泛型)返回值为int的委托
1.4.predicate
1.4.1.predicate 是返回bool型的泛型委托;1.4.2.predicate<int> 表示传入参数为int 返回bool的委托;
1.4.3.Predicate有且只有一个参数,返回值固定为bool;
public delegate bool Predicate<T> (T obj)
2.委托的实例化
2.1.delegate
public delegate int MyDelegateEventHandler (string parm) public int MyMethod(string parm) { //# } MyDelegateEventHandler MyDelegate=new MyDelegateEventHandler(MyMethod)
注:委托实例化的时候,委托对象必须使用 new 关键字来创建,且与一个特定的方法有关。委托参数中的方法不含参数。
2.2.Action的使用
public void Test<T>(Action<T> action, T p) { action(p); } private void Action(string s) { # } //调用 Test<string>(Action,"wyl");
2.3.Func的使用
public int Test<T1, T2>(Func<T1, T2, int> func, T1 a, T2 b) { return func(a, b); } private int Fun(int a, int b) { # } //调用 Test<int,int>(Fun,100,200)
4.综上:
4.1.委托类似于 C++ 函数指针。4.2.委托允许将方法作为参数进行传递。
4.3.委托可用于定义回调方法。
4.4.委托可以链接在一起;多播。
4.5.方法不必与委托签名完全匹配。
相关文章推荐
- [字符编码]Invalid byte 1 of 1-byte UTF-8 sequence终极解决方案
- hdu1495 非常可乐--BFS
- 解决线上问题办法
- 初学安卓路之初识ListView
- PHP查找字符串中的字符串并替换
- 喜欢的橘子
- Vsftp 服务器搭建
- LAMP平台
- Jni中C++和Java的参数传递
- 25岁到55岁,如何规划人生最重要的三个十年
- 优先队列priority_queue的比较函数
- Spring的IoC
- CodeForces 253D Table with Letters - 2 减小复杂度的技巧+交替枚举
- Linux Kernel 之 symbol
- linux mysql install
- 在Centos7上部署安装RobotFramework
- 17.1.1.5 Creating a Data Snapshot Using mysqldump 创建一个快照使用mysqldump:
- Android: 使用JitPack发布你的Github开源库
- 17.1.1.5 Creating a Data Snapshot Using mysqldump 创建一个快照使用mysqldump:
- 17.1.1.5 Creating a Data Snapshot Using mysqldump 创建一个快照使用mysqldump: