C# —— 深入理解委托类型

一. 委托定义

1. 委托与多播委托

委托类型表示对具有特定参数列表和返回类型的方法的引用,定义了委托实例可以调用的某类方法。 通过委托,我们可以动态的通过委托变量来调用委托方法。用delegate来命名委托类型。
委托实例则是指将方法赋值给委托变量的过程。
多播委托是指一个委托实例可以引用一组委托方法,需要用+或+=来添加委托方法,也可以用-或-=来减去右边的委托方法,当然对单个委托方法使用-号等于将NULL赋值给委托变量。

2. 实例方法

当委托的对象为实例方法时,不仅会保留对方法的引用,也可以保留对方法实例的引用。

3. 泛型委托类型

委托类型也可以包含泛型委托参数。(泛型是很重要的概念,后面会专门再写一下)
public delegate T GenericDelagete< T >(T arg);

4. 暂定

二. 例子

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 委托
{

    delegate int Transformer(int a);//定义一个int类型的委托类,只能调用int类型的方法。
    public delegate T Tran<T>(T arg);//定义一个泛型委托类型
  
    class Num //创建一个类,定义一个Tranform方法,可以遍历数组值,并将数组值赋给委托方法。
    {
        public static void Tranform(int[] values, Transformer d)
        {
            for (int i = 0; i < values.Length; i++)
            {
                values[i] = d(values[i]);//将数组的值赋给委托方法
            }
        }

        public int IP(int per)
        {
            Console.WriteLine(per);
            return per;
        }

        public static void Tran1<T>(T[] values,Tran<T> t)
        {
            for (int i = 0; i < values.Length; i++)
            {
                values[i] = t(values[i]);//将数组的值赋给委托方法
            }
        }
    }

    public class Program
    {
        static int Square(int x)
        {
            int r= x* x;//定义Square方法,求平方
            Console.WriteLine(r);
            return r;
        }
        static int Cube(int x)
        { 
            int r= x* x *x;//定义Cube方法,求立方
            Console.WriteLine(r);
            return r;
        }

        static void Main()
        {
            int b;
            int[] c = {1,2,3 };

            Transformer e =null;
            e += Square;//加委托方付
            //Transformer e = new Transformer(Square); //建立委托实例,也可简写成Transformer e = Square;
            e += Cube;
            //e -= Square;//减委托方法
            b = e(3);//等同于b= e.Invoke(3);

            Num.Tranform(c, Square);//调用Tranform,其中可见可以直接引用Square方法
            foreach (int i in c)
            {
                Console.WriteLine($"{i}");//用$可以不用占位符
            }

            Num n = new Num(); //委托对象为实例化方法
            Transformer f = n.IP;  //建立委托实例
            f(3);
            Console.WriteLine(f.Target ==n); //实例方法返回Ture,静态方法返回值为Null

            Num.Tran1<int>(c, Square);//使用泛型类型的委托调用静态方法
            foreach (int i in c)
            {
                Console.WriteLine($"{i}");//用$可以不用占位符
            }
        }
    }     
}

猜你喜欢

转载自blog.csdn.net/baidu_35536188/article/details/110004047