委托(Delegate):值得是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。
声明委托(Delegate):委托声明决定了可由该委托引用的方法。委托可指向一个与其具有相同标签的方法。
实例化委托(Delegate):一旦声明了委托类型,委托对象必须使用 new 关键字来创建,且与一个特定的方法有关。当创建委托时,传递到 new 语句的参数就像方法调用一样书写,但是不带有参数。
委托的多播(Multicasting of a Delegate):委托对象可使用 "+" 运算符进行合并。一个合并委托调用它所合并的两个委托。只有相同类型的委托可被合并。"-" 运算符可用于从合并的委托中移除组件委托。
委托可以有4中定义方式:
委托的第一种赋值方式:NEW
委托的第二种赋值方式:直接赋值
委托的第三种赋值方式:匿名方法
委托的第四种渎职方式:委托变量声明之后使用+=,-=
/
/定义一个 无返回值的 无参数的委托
public delegate void ShowDelegate();
//定义一个 无返回值的 有参数的 委托
public delegate void Show2Delegate(string msg);
//定义一个 有返回值的 有参数的 委托
public delegate string Show3Delegate(string msg);
//定义一个用来测试多播委托的 委托
public delegate void PrintLogDelegate(string log);
public DelegateTest()
{
Console.WriteLine("=====委托的第一种赋值方式 new=====");
ShowDelegate ds = new ShowDelegate(Show);
ds();//委托的第一种调用方式
ds.Invoke();//委托的第2种调用方式
Console.WriteLine("=====委托的第2种赋值方式 直接赋值=====");
Show2Delegate ds_2 = Show2;
ds_2.Invoke("委托的赋值 直接赋值");//显示调用
Console.WriteLine("=====委托的第3种赋值方式 匿名方法=====");
Show2Delegate sd_3 = (msg) =>
{
Console.WriteLine(msg);
};
sd_3.Invoke("委托的赋值 匿名方法");
Console.WriteLine("=====委托的第4种赋值方式 委托变量声明之后使用+=、-= =====");
Show2Delegate sd_4 = null;
sd_4 += Show2;
sd_4 += (msg) => { Console.WriteLine("匿名方法赋值:"+msg); };
sd_4.Invoke("委托变量声明之后使用+=、-= ");
public delegate void ShowDelegate();
//定义一个 无返回值的 有参数的 委托
public delegate void Show2Delegate(string msg);
//定义一个 有返回值的 有参数的 委托
public delegate string Show3Delegate(string msg);
//定义一个用来测试多播委托的 委托
public delegate void PrintLogDelegate(string log);
public DelegateTest()
{
Console.WriteLine("=====委托的第一种赋值方式 new=====");
ShowDelegate ds = new ShowDelegate(Show);
ds();//委托的第一种调用方式
ds.Invoke();//委托的第2种调用方式
Console.WriteLine("=====委托的第2种赋值方式 直接赋值=====");
Show2Delegate ds_2 = Show2;
ds_2.Invoke("委托的赋值 直接赋值");//显示调用
Console.WriteLine("=====委托的第3种赋值方式 匿名方法=====");
Show2Delegate sd_3 = (msg) =>
{
Console.WriteLine(msg);
};
sd_3.Invoke("委托的赋值 匿名方法");
Console.WriteLine("=====委托的第4种赋值方式 委托变量声明之后使用+=、-= =====");
Show2Delegate sd_4 = null;
sd_4 += Show2;
sd_4 += (msg) => { Console.WriteLine("匿名方法赋值:"+msg); };
sd_4.Invoke("委托变量声明之后使用+=、-= ");
Console.WriteLine();
Console.WriteLine();
Console.WriteLine();
Show2Delegate ds2 = new Show2Delegate(Show2);
ds2("这是一个有参数的委托");
ds2("委托的隐式调用");
ds2.Invoke("委托的显示调用");
Console.WriteLine("====调用有返回值 有参数的委托========");
Show3Delegate sd3 = new Show3Delegate(Show3);
//接收委托的返回值
string str = sd3.Invoke("这是有返回值 有参数的委托的测试");
Console.WriteLine(str);
Console.WriteLine("==============多播委托====================");
PrintLogDelegate printLog = null;
printLog += Print1;
printLog += Print2;
printLog += Print3;
//调用
printLog.Invoke("多播委托的测试");
PrintLogDelegate printLog = null;
printLog += Print1;
printLog += Print2;
printLog += Print3;
//调用
printLog.Invoke("多播委托的测试");
printLog -= Print3;
printLog.Invoke("多播委托的测试_去掉一个方法");
printLog.Invoke("多播委托的测试_去掉一个方法");
Console.ReadKey();
}
public void Print1(string log)
{
Console.WriteLine("Print1:" + log);
}
public void Print2(string log)
{
Console.WriteLine("Print2:" + log);
}
public void Print3(string log)
{
Console.WriteLine("Print3:" + log);
}
public void Show()
{
Console.WriteLine("我是具体的方法实现");
}
public void Show2(string msg)
{
Console.WriteLine("Show2:" + msg);
}
public string Show3(string msg)
{
return "返回:" + msg;
}
{
return "返回:" + msg;
}