1.先来一个简单的委托写法,为的是访问一个类中的私有成员。。。。稍微拓展一下,也可以变成回调方法的内部代码。
class Program { static void Main(string[] args) { //调用委托,访问私有成员 Methods m = new Methods(); m.f("你好"); } } //定义一个简单的委托类型 public delegate bool Feedback(string s); class Methods { //初始化一个委托 public Feedback f; public Methods() { //用委托包装改方法 f = new Feedback(writepaper); } //这个方法是私有的 private bool writepaper(string s) { Console.Write(s); return true; } }
2.回调方法
//定义一个简单的委托类型 public delegate bool Feedback(string s); class Program { //这就是回调 Feedback callback; static void Main(string[] args) { Program p = new Program(); //定义回调的方法,调用的是method中的writepaper方法 p.callback = new Feedback(Methods.writepaper); //这相当于系统的invoke p.involke(1,p.callback); Console.ReadKey(); } //用这个名字定义方法,看起来更熟悉 //它可以类比与系统的invoke方法 public void involke(int i ,Feedback fb) { Console.WriteLine(i.ToString()); fb((i+3).ToString()); } } class Methods { public static bool writepaper(string s) { Console.Write(s); return true; } }
3.委托链
//定义一个简单的委托类型 public delegate bool Feedback(); class Program { Feedback callback; static void Main(string[] args) { Feedback f1 = new Feedback(Methods.writepaper1); Feedback f2 = new Feedback(Methods.writepaper2); Feedback f3 = new Feedback(Methods.writepaper3); //委托链 Feedback fbchain = null; //即使fbchain是null也没关系,也一样想委托链中添加委托 fbchain = (Feedback)Delegate.Combine(fbchain,f1); fbchain = (Feedback)Delegate.Combine(fbchain, f2); fbchain = (Feedback)Delegate.Combine(fbchain, f3); //调用委托链,经测试,委托链中的委托是同步调用的,想要异步,就要自己去写方法了 fbchain(); //删除链中的一个委托 fbchain = (Feedback)Delegate.Remove(fbchain, f3); fbchain(); } } class Methods { public static bool writepaper1() { Console.WriteLine("1"); Console.ReadKey(); return true; } public static bool writepaper2() { Console.WriteLine("2"); Console.ReadKey(); return true; } public static bool writepaper3() { Console.WriteLine("3"); Console.ReadKey(); return true; } }
4.Func。。。。。。泛型委托,
//该委托的不论在<>中有几个类型,,最后一个类型必然是返回类型,前面所有的都是参数类型 Func<bool, int> f = (n) => { n = false;return 1; }; Console.WriteLine(f(false)); Console.ReadKey();