目录:
- 什么是委托
- 委托的作用
- 委托的本质
- 委托链
- 委托链返回值
一、什么是委托?
委托:将符合规则的方法进行包装。装载方法引用的盒子。将方法作为参数传递。
class Program { static void Main(string[] args) { StaticDelegateDome(); } //定义没有返回值委托Feedback,需要一个数值类型参数 internal delegate void Feedback(Int32 value); //方法群:静态、静态、实例 private static void FeedbackToConsole(Int32 value) { Console.WriteLine("这是【静态方法】文本显示=" + value); } private static void FeedbackToMsgBox(Int32 value) { Console.WriteLine("这是【这是静态方法】消息框显示=" + value); } private void FeedbackToFile(Int32 value) { Console.WriteLine("这是【实例方法】文件显示=" + value); } //委托回掉方法 private static void Counter(Int32 from, Int32 to, Feedback fb) { for (Int32 val = from; val <= to; val++) { if (fb != null) fb(val); } } //单个静态方法注册 private static void StaticDelegateDome() { Console.WriteLine("---------------静态方法注册委托例子------------------"); Counter(1, 3, null);//没有注册回调方法 Counter(1, 3, new Feedback(Program.FeedbackToConsole));//注册了一个静态的文本显示回调方法 Counter(1, 3, new Feedback(FeedbackToMsgBox));//如果存在一个类里面可以将前面的类可以省略 Console.WriteLine(); Console.ReadKey(); } //单个实例方法注册 private static void InstanceDelegateDome() { Console.WriteLine("---------------实例方法注册委托例子------------------"); Program p = new Program(); Counter(1, 3, null);//没有注册回调方法 Counter(1, 3, new Feedback(p.FeedbackToFile));//注册一个实例方法 Console.WriteLine(); Console.ReadKey(); } //方法组注册委托形成委托链1 private static void ChainDelegateDome1(Program p) { Console.WriteLine("---------------------委托链例子--------------------"); Feedback fb1 = new Feedback(FeedbackToConsole); Feedback fb2 = new Feedback(FeedbackToMsgBox); Feedback fb3 = new Feedback(p.FeedbackToFile); Feedback fbChain = null; fbChain = (Feedback)Delegate.Combine(fbChain, fb1); fbChain = (Feedback)Delegate.Combine(fbChain, fb2); fbChain = (Feedback)Delegate.Combine(fbChain, fb3); Counter(1, 2, fbChain); Console.WriteLine("------------------移除委托链中的方法---------------"); fbChain = (Feedback)Delegate.Remove(fbChain, new Feedback(FeedbackToMsgBox)); } //方法组注册委托形成委托链2 private static void ChainDelegateDome2(Program p) { Console.WriteLine("---------------------委托链例子--------------------"); Feedback fb1 = new Feedback(FeedbackToConsole); Feedback fb2 = new Feedback(FeedbackToMsgBox); Feedback fb3 = new Feedback(p.FeedbackToFile); Feedback fbChain = null; fbChain += fb1; fbChain += fb2; fbChain += fb3; Counter(1, 2, fbChain); Console.WriteLine("------------------移除委托链中的方法---------------"); fbChain -= new Feedback(FeedbackToMsgBox); } }