委托
什么是委托:
委托是一个类型安全的对象,它指向程序中另一个以后会被调用的方法(或多个方法)。通俗的说,委托是一个可以引用方法的对象,当创建一个委托,也就创建一个引用方法的对象,进而就可以调用那个方法,即委托可以调用它所指的方法。
委托是C#中最为常见的内容。与类、枚举、结构、接口一样,委托也是一种类型。类是对象的抽象,而委托则可以看成是函数的抽象。一个委托代表了具有相同参数列表和返回值的所有函数。比如:
public delegate int MyDelegate(int x, int y);
如何使用委托?
1、定义委托类型
[访问修饰符]delegate 返回类型 委托名(形参);
public delegate void DelSay(string name);
2、声明委托对象
委托名 委托实例名;
3、创建委托对象(确定与哪些方法进行绑定)
委托实例名=new 委托名(某个类的方法)
4、使用委托调用方法
委托实例名(实参)
委托注意事项:
1、委托和方法必须具有相同的参数。
2、委托可以调用多个方法,即一个委托对象可以维护一个可调用方法的列表而不是单独的一个方法,称为多播委托。
3、方法可以直接赋值给委托,前提是它们的签名必须一致。
委托例子一:
public delegate void DelSay(string name);//声明一个委托,与类同级别 class Program { static void Main(string[] args) { DelSay de = SayChinese;//方法直接赋值给委托,这里虽然没有new,但看反编译器,DelSay de = new DelSay(SayChinese); de("李四");//调用 Test("张三", SayChinese);//Test("张三", new DelSay(SayChinese)); Console.ReadKey(); } //声明一个方法,传入一个字符串类型和委托类型 public static void Test(string name, DelSay del) { del(name); } public static void SayChinese(string name) { Console.WriteLine("你好" + name); } public static void SayEnghish(string name) { Console.WriteLine("Hello" + name); } }
委托例子二:
public delegate string StrDel(string name);//声明一个委托,与类同级别 class Program { static void Main(string[] args) { string[] names = { "abCdeFGH","ijkLMNoPqR","StUvw","xyZ"}; //第一种方法,调用一个委托 ProStr(names,StrToUpper); //第二种方法,使用匿名方法
//执行顺序:1、执行ProStr方法;2、ProStr方法每一次循环会去调用一个匿名方法;3、匿名方法每次返回一个值;4、再次执行ProStr方法 ProStr(names, delegate(string name) { return name.ToUpper(); }); //第三种方法,使用lamba表达式 ProStr(names, name => name.ToUpper()); Console.ReadKey(); } //定义一个方法,转入字符串数组和一个委托 public static void ProStr(string[] name, StrDel del) { for (int i = 0; i < name.Length; i++) { name[i] = del(name[i]); } } //转大写方法 public static string StrToUpper(string name) { return name.ToUpper(); } }
使用委托求数组的最大值和任意数组的最大值
public delegate int DelCompare(object o1,object o2); class Program { static void Main(string[] args) { object[] nums = { 9, 8, 6, 7, 5, 10, 22, 32, 14, 33, 21 }; object max1 = GetMax(nums, delegate(object o1,object o2) { return (int)o1 - (int)o2; }); object max2 = GetMax(nums, (object o1, object o2) => { return (int)o1 - (int)o2; }); Console.WriteLine(max1); Console.WriteLine(max2); Console.ReadKey(); } public static object GetMax(object[] nums, DelCompare del) { object max = nums[0]; for (int i = 0; i < nums.Length; i++) { //要传一个比较的方法, //返回值为int类型 //比较它们相差是否小于零则第一个数小于第二个数 if (del(max, nums[i]) < 0) { max = nums[i]; } } return max; } }