• 读书笔记之C# delegate


    c#代理的使用主要在:需要将一个方法当做参数传递到另一个方法时。

    比如启动一个线程执行任务,而这个线程要执行的方法可以通过代理传递过来。

    代理包括一个方法或者多个方法的地址和C++的函数指针很相似,但它是类型安全的。

    1.声明代理

    delegate void IntMethodInvoker(int x);

    这个代理可以引用返回值类型为空,有一个参数的所有方法,很重要的一点需要知道delegate是类型安全的。

    delegate double TwoLongsOp(long first, long second);

    有两个参数返回值为double的代理。

    delegate string GetAString();

    没有参数返回值为string的代理。

    public delegate string GetAString();

    还可以说明代理的访问权限。

    2.使用代理

    使用代理必须先要实例化一个代理

    pri v a te delegate string GetAString();
    static void Main()
    {
    int x = 40;
    GetAString firstStringMethod = new GetAString(x.ToString); //实例化一个代理,并把该代理指向x.tostring();
    Console.WriteLine("String is {0}", firstStringMethod()); //firstStringMethod()成为x.tostring()代表(代理)
    // With firstStringMethod initialized to x.ToString(),
    // the above statement is equivalent to saying
    // Console.WriteLine("String is {0}", x.ToString());
    }

     可以通过以下两种方法来调用已经实例化的方法

    firstStringMethod();
    firstStringMethod.Invoke();

    当然在实例化一个代理的时候并传递方法也可以通过以下两种形式

    GetAString firstStringMethod = new GetAString(x.ToString);

    GetAString firstStringMethod = x.ToString;

    请看下面代理实例

        class mathOperation
        {
            public static double MultiplyByTwo(double value)
            {
                return value * 2;
            }

            public static double Square(double value)
            {
                return value * value;
            }
        }

    定义一个方法,该方法有两个静态函数,分别用于计算值得倍数和值的平方。

       class Program
        {
            delegate double DoubleOp(double x);  //定义代理用于代理相应的方法
            static void Main(string[] args)
            {
                DoubleOp[] operations =
                {
                    mathOperation.MultiplyByTwo,
                    mathOperation.Square
                }; //实例化一个代理数组,第一个数组元素代理MultiplyByTwo方法第二个数组元素代理Square方法
                for(int i =0 ; i < operations.Length;i++)
                {
                    Console.WriteLine("Using operations[{0}]:", i);
                    ProcessAndDisplayNumber(operations[i], 2.0);
                    ProcessAndDisplayNumber(operations[i], 7.94);
                    ProcessAndDisplayNumber(operations[i], 1.414);
                    Console.WriteLine();
                }

            }

            static void ProcessAndDisplayNumber(DoubleOp action,double value) //代理作为参数进行传输
            {
                double result = action(value);
                Console.WriteLine("Value is {0} , result of operation is {1}", value, result);
            }
        }

    二、如果不想定义代理类型而使用代理可以使用下列代理形式

    Action<T> and Func<T> Delegates

    action<T>指向没有返回类型的方法,可以传递16个参数,其形式如下:

     Action<in T> 指向一个参数的方法

     Action<in T1, in T2> 指向两个参数的方法

     Action<inT1, in T2, in T3, in T4, in T5, in T6, in T7, in T8> 指向八个参数的方法

     Func<T> 最多也可以传递16个参数,并且具有返回值类型

     Func<out TResult> 指向没有参数,有一个返回值类型的方法。

     Func<in T, out TResult> 指向一个参数的方法

     Func<in T1, inT2, in T3, in T4, out TResult> 指向一个具有四个参数的方法。

    1、应用举例

    在上面的实例中我们定义了一个代理来指向静态方法如下形式

    delegate double DoubleOp(double x);

    如果不想自己定义代理,可以使用如下形式来指向静态函数的两个方法

    Func<double, double>[] operations =
    {
     MathOperations.MultiplyByTwo,
     MathOperations.Square
    };  //使用func<double, double> 来指向有返回值类型的一个参数。并不需要自己再自定代理,而使用系统自带的代理方法。

    把这个代理作为参数传递给相应的方法,其格式如下

    static void ProcessAndDisplayNumber(Func<double, double> action,double value) //第一个参数是代理实例,第二个参数是代理所用到的参数值
    {
    double result = action(value);
    Console.WriteLine("Value is {0}, result of operation is {1}",
    value, result);
    }

  • 相关阅读:
    [转]Asp.NET MVC Widget开发
    [转]让Windows Server 2008 + IIS 7+ ASP.NET 支持10万并发请求
    [转]jquery Fancybox丰富的弹出层效果
    [转]响应式网页设计:rem、em设置网页字体大小自适应
    [转]jQuery Popup Login and Contact Form
    [转][ASP.NET MVC 小牛之路]12
    [转]jQuery插件实现模拟alert和confirm
    [转]Ionic 实现双击返回键退出功能
    [转]Ionic – Mobile UI Framework for PhoneGap/Cordova Developers
    [转]VS2015 cordova尝试-camera
  • 原文地址:https://www.cnblogs.com/tianmochou/p/4933874.html
Copyright © 2020-2023  润新知