zoukankan      html  css  js  c++  java
  • C#的委托(Delegates in C#) part one 野峰

    什么是委托(what's a delegate)?

     

    计算机中的名词术语大部分都是借自日常生活,所以我们先来看看日常生活中“delegate”是什么意思。

     

    Merriam-Webster Unabridged Dictionary对“delegate”的定义:

    A person sent and empowered to act for another.

    派遣并授权代表某人行事的人。

     

     

    由此可见,“delegate”有委托、代理、代表之意,就是代替(代表)别人去做事(的人)。那么,“delegate”在C#中又是什么意思呢?

     

    The C# Programming Language"delegate"的定义:

    A delegate type represents references to methods with a particular parameter list and return type.

    委托类型表示方法引用,这些方法可以带有特定参数表和返回类型。

     

     

    此定义非常简洁地定义了“delegate”,可以从三个方面来理解:

    1delegate是一个类型(type),是一个语言级的构造;

    2delegate表示的是方法引用,delegate实际上是对方法的封装(wrapper);

    3delegate所引用的方法可以有自己特定的参数表和返回类型,也就是说,不同的delegate其引用的方法可以有不同的参数表和返回类型。

     

     

    既然delegateC#的语言构造,那么如何声明一个delegate呢?

     

    委托的声明(declare a delegate

     

    delegateC#中易于使人迷惑的语言构造,尤其是其声明语法,很不自然。

    例:

    public delegate string MyDelegate(int n);// 声明MyDelegate是一个委托

     

     

    我们熟悉的是方法和类的声明,如:

    public class MyClass// class

    {

    public string ToString();// method

    }

     

     

    delegate的声明语法之所以使人困惑,是因为在一个语句中综合了类的声明和方法的声明。

    1public delegate ...,这个不完全语句更像一个class的声明;

    2string MyDelegate(int n); 这个不完全声明是delegate所引用的方法的声明,表明MyDelegate所引用的方法必须具有string XXX(int n)这样的签名(signature)。

     

    C#中的delegate是一级语言构造,准确地说,是一个类。而且C#编译器在遇到如上的delegate声明语句之时,会生成如下所示的类声明代码:

    public class MyDelegate : System.MultiCastDelegate

    {

    public MyDelegate(Object object, IntPtr method);

    public virtual string Invoke(int32 value);

    public virtual IAsyncResult BeginInvoke(int32 value, AsyncCallback callback, Object object);

    public virtual string EndInvoke(IAsyncResult result);

    }

     

    如下图所示:

     

     

  • 相关阅读:
    如何找出数组中重复次数最多的数
    如何计算两个有序整型数组的交集
    如何分别使用递归与非递归实现二分查找算法
    如何用递归算法判断一个数组是否是递增
    如何用一个for循环打印出一个二维数组
    如何用递归实现数组求和
    ElasticSearch安装和head插件安装
    SpringBoot全局异常处理方式
    Redis高级命令操作大全--推荐
    Mysql中FIND_IN_SET和REPLACE函数简介
  • 原文地址:https://www.cnblogs.com/prowyh/p/2399473.html
Copyright © 2011-2022 走看看