一. 委托定义
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}");//用$可以不用占位符
}
}
}
}