基础拾遗------委托详解

前言:

  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个参数,根据返回值泛型返回。必须有返回值,不可void

Func是无返回值的泛型委托
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.方法不必与委托签名完全匹配。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏偏前端工程师的驿站

编译期类型检查 in ClojureScript

前言  话说"动态类型一时爽,代码重构火葬场",虽然有很多不同的意见(请参考),但我们看到势头强劲的TypeScript和Flow.js,也能感知到静态类型在某...

1777
来自专栏向治洪

Kotlin之基本语法

在今年Google IO大会上Google已经明确kotlin作为为Android第一官方语言的地位。我相信Google的决意,就像当初毫不犹豫的抛弃eclip...

2287
来自专栏Android Note

介绍Kotlin第二部分(翻译篇)

1284
来自专栏程序你好

如何将Array转换为List?

可以使用 Arrays.asList() 方法, 该方法接受一个数组作为输入,并返回一个列表作为输出。

802
来自专栏大数据学习笔记

Spark2.x学习笔记:2、Scala简单例子

2、 Scala简单例子 参考教程:https://yq.aliyun.com/topic/69 2.1 交互式编程 spark-shell是Spark交互式...

3938
来自专栏偏前端工程师的驿站

委托与事件

  首先多谢网上的大牛们无私地分享自己的经验,让我这样的小鸟能站在巨人的肩膀上不断前进!   参考网址:http://www.knowsky.com/39593...

1686
来自专栏xingoo, 一个梦想做发明家的程序员

static_cast const_cast reindivter_cast dynamic_cast

C 风格(C-style)强制转型如下: (T) exdivssion // cast exdivssion to be of type T 函数风格(Func...

20110
来自专栏java学习

Java每日一练(2017/8/17)

每日一句 学的到东西的事情是锻炼,学不到的是磨练。 查看以前的所有练习题目以及答案:https://mp.weixin.qq.com/mp/homepage?_...

2659
来自专栏日常学python

爬虫必学知识之正则表达式上篇

这是日常学python的第12篇文章 在向网页进行了提交请求之类的之后,我们可以得到了网页的返回内容,里面自然而然会有我们想要的数据,但是html元素文本这么多...

3216
来自专栏用户2442861的专栏

java泛型(一)、泛型的基本介绍和使用

http://blog.csdn.net/lonelyroamer/article/details/7864531

781

扫码关注云+社区