函数指针升级版
Action委托:仅用于返回值为void的方法,参数数量有0~16个
Func: 最后一个泛型参数代表委托对应的方法的返回值
// void Report() Action action = new Action(Report); // call: action.Invoke(); action(); // double Add(int, int) Func<int, int, double> func = new Func<int, int, double>(Add);
自定义委托类:
delegate <returnType> <name>(<paras>); 其中
returnType 和 paras 与传进去的函数对应其作为一个类,一般声明在主类之外
public delegate int MyDelegate(int, int); // 类比int (*func)(int, int),但是有不少差异 class Program { // 定义符合委托签名的方法 static int Add(int a, int b) { return a + b; } }
应用:
模板方法 / 回调方法(区别就是回调方法是条件触发的)
问题:不好维护,如果委托的方法是一个类实例的方法那这个对象的内存会一直无法被释放,造成内存泄漏(因为底层需要一个target来调用)
封装多个方法:多播委托,用+=来添加委托
委托调用顺序:按照委托的添加顺序
同步调用:Invoke()
异步调用:BeginInvoke()
可以用接口取代委托(即本来是用委托作为callback参数,但是现在换成一个接口的实例,在方法体内调用这个接口的对应方法,减少了方法的耦合)
内部机制

Method: System.Reflection.MethodInfo: 描述方法签名
Object: 用于包含要调用的方法的对象实例,如果是静态方法则为null