C#中的委托实例代码详解(图文)


本文摘自PHP中文网,作者黄舟,侵删。

本文主要介绍了C#中委托的相关知识。具有一定的参考价值,下面跟着小编一起来看下吧

委托这个东西不是很好理解,可是工作中又经常用到,你随处可以看到它的身影,真让人有一种又爱又恨的感觉,我相信许多人被它所困扰过。

一提到委托,如果你学过C语言,你一定会马上联想到函数指针。

什么是委托?委托是C#中类型安全的,可以订阅一个或多个具有相同签名方法的函数指针。委托可以把函数做为参数传递,其实际意义便是让别人代理你的事情。委托可以看做是函数的指针,整数可以用整数变量指向它,对象可以用对象变量指向它,

函数也可以用委托变量指向它。我们可以选择将委托类型看做只定义了一个方法的接口,而委托的实例可以看做是实现了那个接口的一个对象。

使用委托,必须满足4个条件:

  • 声明委托类型;

  • 必须有一个方法包含了要执行的代码;

  • 必须创建一个委托实例;

  • 必须调用(invoke)委托实例。

委托的申明

声明委托的方式:delegate 返回值类型 委托类型名(参数)

委托的申明和接口方法的申明基本上一致,只是在返回类型关键字的前面多了一个delegate关键字。还有就是委托一般声明为public类型,因为它随时要供别人调用的。

委托的本质也是一个类型。我们声明一个类可以进行实例化,同样委托也可以进行实例化。

有如下四种委托:

1

2

3

4

5

6

7

8

//1.无参数无返回值

    public delegate void NoParaNoReturnEventHandler();

    //2.有参数无返回值

    public delegate void WithParaNoReturnEventHandler(string name);

    //3.无参数有返回值

    public delegate string NoParaWithReturnEventHandler();

    //4.有参数有返回值

    public delegate string WithParaWithReturnEventHandler(string name);

如果代码想要执行操作,但不知道操作细节,一般可以使用委托。例如, Thread类之所以知道要在一个新线程里运行什么,唯一的原因就是在启动新线程时,向它提供了一个ThreadStart或ParameterizedThreadStart委托实例。

1

2

3

4

Thread th = new Thread(Test);

th.Start();

public Thread(ThreadStart start);

public delegate void ThreadStart();

ThreadStart是一个无参无返回值的委托。

1

2

3

4

static void Test()

{

  Console.WriteLine("线程方法");

}

这个Test方法的函数签名必须和委托ThreadStart的函数签名一致。

委托的调用

必须先实例化委托,然后再调用。

函数的签名和委托的签名必须一致。NoParaNoReturnEventHandler _NoParaNoReturnEventHandler = ConsoleInfo;,编译器帮我们进行了new,但是不能写成NoParaNoReturnEventHandler _NoParaNoReturnEventHandler = ConsoleInfo();

因为这样就成为了函数调用。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

#region 无返回值委托调用

    public static void Show()

    {

      //实例化委托

      NoParaNoReturnEventHandler _NoParaNoReturnEventHandler = new NoParaNoReturnEventHandler(ConsoleInfo);

      //NoParaNoReturnEventHandler _NoParaNoReturnEventHandler = ConsoleInfo; //简写

      //委托调用 通过Invoke()调用,或者可以直接省略

      _NoParaNoReturnEventHandler.Invoke();

      //_NoParaNoReturnEventHandler();

    }

    private static void ConsoleInfo()

    {

      Console.WriteLine("无参数无返回值的函数调用");

    }

    #endregion

没有委托就没有异步,异步正是因为委托的存在。

_NoParaNoReturnEventHandler.BeginInvoke(null,null); //异步调用

为什么要使用委托

我们完全可以直接调用方法,为什么还需要通过一个委托来调用呢?委托有什么意义?

解耦,对修改关闭,对扩展开放。逻辑分离。

你可以把委托理解为函数的父类,或者是一个方法的占位符。

我们来看下代码,假设有2个方法,一个说英语,一个说汉语,而这2个方法的函数签名是一样的。

1

2

3

4

5

6

7

8

public static void SayChinese(string name)

    {

      Console.WriteLine("你好," + name);

    }

    public static void SayEnglish(string name)

    {

      Console.WriteLine("hello," + name);

    }

那么我们在外部调用的时候,

1

2

MyDelegate.SayChinese("张三");

MyDelegate.SayEnglish("zhangsan");

如果要调用这两个不同的方法,是不是要写不同的调用代码

我们能不能只一个方法调用呢?修改代码如下:

阅读剩余部分

相关阅读 >>

分析C#httpwebrequest访问https错误处理的方法

C#教程】C# 预处理器指令

C#中backgroundworker用法的详解(图)

C#使用selenium+phantomjs抓取数据详解

C#开发实例-订制屏幕截图工具(三)托盘图标及菜单实现的图文介绍

C#中winform制作异形窗体与控件的实现方法

C#中匿名委托以及lambda表达式的实例详解

详情介绍C#中winform实现多线程异步更新ui的示例代码

关于C#如何将word转换成pdf的方法汇总

C#实现char字符数组与字符串相互转换的方法详解

更多相关阅读请进入《C#》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...