委托是一种可以指向方法的数据类型,可以声明委托类型变量。
声明委托的方式:delegate返回值类型 委托类型名(参数)
比如delegate void MyDel(int n)
注意这里的除了前面的delegate,剩下部分和声明一个函数一样,但是Mydel不是函数名,而是委托类型名
如何创建委托类型的对象:MyDel sp = new Mydel (SayHello)//SayHello需要和MyDel的参数返回值一样;sp这个委托变量就指向SayHello这个方法。注意不要写成new Mydel (SayHello())因为加上()就是调用方法了
简化的方法:MyDel sp = SayHello;//编译器会给搞成new Mydel (SayHello),反编译看看。注意不要写成MyDel sp = SayHello();
委托的使用:委托变量之间可以互相赋值,就是一个传递指向方法的过程;sp()就是调用指向的方法,如果有参数就传递参数。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace mydelSour
{
public class Program
{
static void Main(string[] args)
{
/*
*
* 委托如何调用方法
* 被调用的方法 返回类型 参数类型 必须要和委托保持一致才可以 如: getNameInt string 参数(string a ,int i) /delegate string mydelInt(string na,int a);
* 把调用的方法名当参数传入 mydelInt d2 = new mydelInt(getNameInt) delegate string mydelInt(string na,int a); getNameInt(string a ,int i)
* 然后用用实例化对象参入参数 d2("henry",3); 参数 (string na,int a);
*/
mydel dl = new mydel(getName);
dl();
mydelInt d2 = new mydelInt(getNameInt);
//Console.Write(d2); //对象不写括号的话相当于对象tostring d2.tostring();
// Console.Write(d2("henry", 3) ); //带上括号()就指调用方法,带括号和不带括号是不一样的
d2("henry", 3);
object[] objs = { 1, 2, 4, 4, 2, 1, 2, 3 };
//通过这样写,获取最大值的算法已经确定,在传参数的是后指定上比较方法就好了
//用委托后,我们不在为每个获取最大值的方法都去写一种算法
int max = (int)GetMax(objs, CompareInt);//原生的写法为GetMax(objs,new CompareNum(CompareInt));//只不过编译器帮我们进行了处理
Console.WriteLine(max);
Console.ReadKey();
}
public static void getName()
{
Console.WriteLine("委托调用无返回类型方法getname");
}
public static string getNameInt(string a, int i)
{
Console.Write(a + i);
return a;
}
delegate bool CompareNum(object obj1, object obj2);
static bool CompareInt(object obj1, object obj2)
{
int i1 = (int)obj1;
int i2 = (int)obj2;
return i1 > i2;
}
static object GetMax(object[] obj, CompareNum cpn)
{
object max = obj[0];
for (int i = 1; i < obj.Length; i++)
{
if (!cpn(max, obj[i]))
{
max = obj[i];
}
}
return max;
}
}
}
更多技术请关注