zoukankan      html  css  js  c++  java
  • 【C#语言规范版本5.0学习】1.10 委托

    委托类型 (delegate type) 表示对具有特定参数列表和返回类型的方法的引用。通过委托,我们能够将方法作为实体赋值给变量和作为参数传递。委托类似于在其他某些语言中的函数指针的概念,但是与函数 指针不同,委托是面向对象的,并且是类型安全的。 下面的示例声明并使用一个名为 Function 的委托类型。

    using System;
    delegate double Function(double x);
    class Multiplier
    {
    double factor;
    public Multiplier(double factor) {
    this.factor = factor;
    }
    public double Multiply(double x) {
    return x * factor;
    }
    }
    class Test
    {
    static double Square(double x) {
    return x * x;
    }
    static double[] Apply(double[] a, Function f) {
    double[] result = new double[a.Length];
    for (int i = 0; i < a.Length; i++) result[i] = f(a[i]);
    return result;
    }
    static void Main() {
    double[] a = {0.0, 0.5, 1.0};
    double[] squares = Apply(a, Square);
    double[] sines = Apply(a, Math.Sin);
    Multiplier m = new Multiplier(2.0);
    double[] doubles = Apply(a, m.Multiply);
    }
    }
    View Code

    Function 委托类型的实例可以引用任何接受 double 实参并返回 double 值的方法。Apply 方法将给定的 Function 应用于 double[] 的元素,并返回含有结果的 double[]。在 Main 方法中,Apply 用于将三个不同的函数应用于一个 double[]。

    委托既可以引用静态方法(例如前一示例中的 Square 或 Math.Sin),也可以引用实例方法(例如前一示例中的 m.Multiply)。引用了实例方法的委托也就引用了一个特定的对象,当通过该委托调用这个实例方法时,该对象在调用中成为 this。

    也可以使用匿名函数创建委托,这是即时创建的“内联方法”。匿名函数可以查看外层方法的局部变量。 因此,可以在不使用 Multiplier 类的情况下更容易地写出上面的乘法器示例:

    double[] doubles = Apply(a, (double x) => x * 2.0);

    委托的一个有趣且有用的属性在于,它不知道也不关心它所引用的方法的类;它仅关心所引用的方法是否与委托具有相同的参数和返回类型。

  • 相关阅读:
    shell 读取文件内容 不以空格换行 再把每行的字符串切分取一部分
    Linux中basename和dirname命令的妙用
    Martiancloud 无注册中心微服务
    spring security自动续签功能
    访问c++类的私有成员
    Ubuntu 安装 docker 及 镜像加速
    谷歌浏览器表单自动填充颜色修改(antd)
    关于复制粘贴失效解决办法
    常见的HTTP状态码(HTTP Status Code)
    Linux 环境安装 MySQL
  • 原文地址:https://www.cnblogs.com/TechSingularity/p/14335515.html
Copyright © 2011-2022 走看看