委托
委托
1.什么是委托?
个人理解:委托就是把一个方法当做参数传入另一个方法中进行调用。 (委托的实质就是一个类,可以通过中间语言IL编译工具去查看源码)
2.委托的使用?
使用委托三部曲:(1)、委托的声明 。 (2)、委托的实例化。 (3)调用。
3.委托的种类?
(1).delegate (2).泛型委托 Func/ Action (3). event 和观察者模式
通过delegate 关键字来声明委托 举例:
1 public delegate void NoReturnNoPara(); // 无参数、无返回值的委托声明 2 public delegate void NoReturnWithPara(int x, int y);//1 声明委托 3 public delegate int WithReturnNoPara(); //无参数、int类型返回值委托声明 4 public delegate MyDelegate WithReturnWithPara(out int x, ref int y);//自定义委托类
1 private void DoNothing() //无参数无返回值的方法 2 { 3 Console.WriteLine("This is DoNothing 。。。。"); 4 }
1 NoReturnNoPara method = new NoReturnNoPara(this.DoNothing);// this表示是当前类的方法,也可以把方法拆分到其他类中。这里是为了使用方便。 2 //2 委托的实例化 要求传递一个参数类型 返回值都跟委托一致的方法, 3 method.Invoke();//3委托实例的调用 参数和委托约束的一致
上述三段代码,第一段是委托类型的声明; 第二段代码是为实例化委托做准备,通过实例化委托将DoNothing方法作为参数传入到委托中;第三段代码是最后调用DoNothing方法,执行DoNothing中的业务逻辑。注意:委托声明、委托的实例化 要求传递一个参数类型 返回值都跟委托一致的方法,委托实例的调用 参数和委托约束的一致。
Action Func .NetFramework3.0出现的
Action 系统提供 0到16个泛型参数 不带返回值 委托
1 //Action action = new Action(this.DoNothing); 2 Action action0 = this.DoNothing;//是个语法糖,就是编译器帮我们添加上new Action 3 action0.Invoke();
在这里的action0.invoke()和上述 method.Invoke() 执行的结果是一致的。这里推荐使用泛型委托。
Func 委托: 无参数int类型返回值
1 public int Get() 2 { 3 return 1; 4 } 5 6 //Func 系统提供 0到16个泛型参数 带泛型返回值 委托 7 Func<int> func0 = this.Get; 8 int iResult = func0.Invoke();
带参数有返回值的Func委托 int类型参数,字符串类型的返回值
1 private string ToString(int i) 2 { 3 return i.ToString(); 4 } 5 Func<int, string> func1 = this.ToString; //第一个是参数类型 ,第二个是返回值类型 6 func1.Invoke(0);