最近处于面试找工作的阶段,面试中遇到这个问题已经多次,一直想了解,就趁这个机会好好梳理一下啊。
当提及委托,大多数人第一印象是它相当于C++的函数指针,可以将方法作为参数进行传递,也可以达到函数回调的作用。
委托例子:其实在生活中也有很多这样的例子,例如我们打官司,首先应该找到律师,委托律师去帮我们打官司,这就是委托。在程序中我们可以针对这个例子这样写:
1、首先定义一个委托:public delegate void Lawyer(string matter) //相当于律师这个角色
2、再声明这个委托:Lawyer lawyer;//这个步骤相当于你具体请的是哪一个律师
3、给委托这个类型赋值,就是指明这个委托需要干一件什么样的事情:
//声明一个方法
public static void litagtion(string matter)//matter 代表是一个什么样的事情
{
Console.WriteLine(”为{0}进行诉讼“,matter);
}
给委托这个类型赋值有二种方法:
1、实例化直接赋值:Lawyer lawyer=new Lawyer(litagtion);
2、不用new:Lawyer lawyer=litagtion;(C#2.0引进而来)
4、调用委托: lawyer(“房产争端”);
二、Action委托:事实上,.NET Framework现在提供了17个Action
委托,它们从无参数到最多16个参数,使用起来非常方便。如果需要返回值,可使用Func函数。如果需要使用ref或out关键字以传引用的方式传递参数,就需要自己定义委托了。
static void Main(string[] args) { Test<string>(Action,"Hello World!"); Test<int>(Action, 1000); Test<string>(p => { Console.WriteLine("{0}", p); }, "Hello World");//使用Lambda表达式定义委托 Console.ReadKey(); } public static void Test<T>(Action<T> action, T p) { action(p); } private static void Action(string s) { Console.WriteLine(s); } private static void Action(int s) { Console.WriteLine(s); }
三、Func委托
首先来说明Func委托,通过MSDN我们可以了解到,Func委托有如下的5种类型:
(1) *delegate TResult Func<TResult>();
(2)*delegate TResult Func<T1,TResult>(T1 arg1);
(3) *delegate TResult Func<T1,T2,TResult>(T1 arg1, T2 arg2);
(4)*delegate TResult Func<T1,T2,T3,TResult>(T1 arg1, T2 arg2, T3 arg3);
(5)*delegate TResult Func<T1,T2,T3,T4,TResult>T1 arg1, T2 arg2, T3 arg3, T4 arg4);