using System;
namespace _委托
{
class MainClass
{
#region 委托
#endregion
/*
委托(Delegate)是存在某个方法的引用的一种引用类型变量.引用可以在运行时被改变;
// 委托也是一种类型,它与类一样,需要我们自己来定义;
public delegate void Greeting(string name){
关键字 返回值类型 委托类型 (参数)
}
// 定义时委托类型的返回值和参数与要引用的方法的返回值和参数一致,二者在外形上一样,只是委托用delegate修饰;
委托的声明:
1. 委托声明; 例如: public delegate int MyDelegate(string s);
2. 委托实例化; 例如: MyDelegate myDlegate = new MyDelegate(参数);
3. 调用委托;
委托是面向对象的,类型是安全和保险的,委托既能调用静态方法,又能引用实例方法;
*/
#region 例1 委托调用: 委托实例化和调用委托在Main()中
#endregion
// 1. 先声明一个委托
delegate int MyDelegate(int num); // 委托声明
public static int number=10;
public static int AddNum(int a){
// int number=10;
number += a;
Console.WriteLine (number);
return number;
}
public static int AddNum_1(int a){
// int number=10;
number *= a;
Console.WriteLine (number);
return number;
}
public static int AddNum_2(){
Console.WriteLine (number);
return number;
}
/*
// 委托的多播:
委托是一个类,可以作为参数来传递;
值能合并相同的委托, 委托对象可以使用"+" 运算符来进行合并,一个合并委托调用它所合并的两个委托,
"-" 运算符可以用于从合并的委托中移除组件委托;
*/
#region 委托的多播: 可以用"+"运算符来进行合并, 也可以用"-"从合并的委托中移除组件委托
#endregion
// 例2:
// 1. 先声明一个委托
public delegate void Talk(string name);
// 2. 定义2个构造方法,用于合并委托
public static void SayHello(string name){
Console.WriteLine ("{0},你好,我在世界城",name);
}
public static void Speak(string name){
Console.WriteLine ("{0},Me too,Nice too meet you",name);
}
public static void Main (string[] args)
{
#region 例1 委托调用: 委托实例化和调用委托在Main()中
#endregion
// 2. 委托实例化
MyDelegate myDelegate=new MyDelegate (AddNum); // 委托实例化
MyDelegate myDelegate_1=new MyDelegate(AddNum_1); // 委托实例化
// 3.调用委托
myDelegate(20);
// Console.WriteLine (myDelegate);
myDelegate_1 (10);
// Console.WriteLine (myDelegate_1);
// 输出: 30, 300
MyDelegate mydeletage_2;
mydeletage_2 = myDelegate;
mydeletage_2 += myDelegate_1;
mydeletage_2 (5);
#region 例2 委托的多播: 可以用"+"运算符来进行合并, 也可以用"-"从合并的委托中移除组件委托
#endregion
// 2. 委托实例化
Talk talk; // 用委托去调
talk = SayHello;
talk += Speak;
talk("沙迦");
talk = SayHello; // 在上一次合并的基础上再移除委托组件
talk -= Speak;
talk ("如来如");
}
}
}