//从第一个方法看到第9个方法, 看完就差不多了.
using System;
using System.Collections.Generic;
using System.Text;
namespace Delegate
{
//定义委托, 它定义了可以代表的方法的类型
public delegate void GreetingDelegate(string name);
class P2
{
public GreetingDelegate gd3;
public event GreetingDelegate gd4;
//注意此方法, 它接受一个GreetingDelegate类型的方法作为参数
public void GreetPeople(string name, GreetingDelegate MakeGreeting)
{
MakeGreeting(name);
}
}
class Program
{
private static void EnglishGreeting(string name)
{
Console.WriteLine("Morning, "+name);
}
private static void ChineseGreeting(string name)
{
Console.WriteLine("早上好, " + name);
}
//注意此方法, 它接受一个GreetingDelegate类型的方法作为参数
private static void GreetPeople(string name,GreetingDelegate MakeGreeting)
{
MakeGreeting(name);
}
static void Main(string[] args)
{
//Method1();
//Method2();
//Method3();
//Method4();
//Method5();
//Method6();
//Method7();
//Method8();
Method9();
Console.ReadKey();
}
///
/// 9.事件也没有什么了不起的, 它是封装之后的委托类型的变量
/// 不过, 它只能在+=或-=的左边, 也不能直接调用
///
private static void Method9()
{
P2 p = new P2();
//这是是错误的,p.gd4只能出现在+=或-=的左边p.gd4 = new GreetingDelegate(EnglishGreeting);
p.gd4 += ChineseGreeting;
//同时的错误: p.GreetPeople("Jack", p.gd4);
}
///
/// 8.将委托封装在P2这个类里
/// 注意:此时的委托, 如是private,则外部无法访问, 如是public,则外部的赋值又可以随意赋值了.
///
private static void Method8()
{
P2 p = new P2();
p.gd3 = new GreetingDelegate(EnglishGreeting);
p.gd3 += ChineseGreeting;
p.GreetPeople("Jack", p.gd3);
}
///
/// 7.一般来说, GreetPeople和EnglishGreeting,ChineseGreeting不在一个类中.
///
private static void Method7()
{
GreetingDelegate gd1 = new GreetingDelegate(EnglishGreeting);
gd1 += ChineseGreeting;
P2 p = new P2();
p.GreetPeople("Jack", gd1);
}
///
/// 6.可以取消其中的一个方法
///
private static void Method6()
{
GreetingDelegate gd1 = new GreetingDelegate(EnglishGreeting);
gd1 += ChineseGreeting;
Console.WriteLine("绑定了两个方法!");
GreetPeople("Jack", gd1);
Console.WriteLine("取消了其中的一个方法");
gd1 -= ChineseGreeting;
GreetPeople("Jack", gd1);
}
///
/// 5.可以像类一样直接得到对象, 但是GreetingDelegate gd1=new GreetingDelegate();却是错误的;
///
private static void Method5()
{
GreetingDelegate gd1 = new GreetingDelegate(EnglishGreeting);
//错误的: GreetingDelegate gd2= new GreetingDelegate();
gd1 += ChineseGreeting;
gd1("Jack");
}
///
/// 4.可以不用那个中转的方法, 直接调用委托
///
private static void Method4()
{
GreetingDelegate gd1 = EnglishGreeting;
gd1 += ChineseGreeting;
gd1("Jack");
}
///
/// 3.委托最奇妙的地方: 一个委托类型的变量可以绑定多个方法, 调用委托时, 会依次调用这些方法
/// 注意:第一次是赋值的语法, 第二次是绑定的语法, 如果第一次就用+=, 则会出现"无效的表达式项"的编译错误
///
private static void Method3()
{
GreetingDelegate gd1 = EnglishGreeting;
gd1 += ChineseGreeting;
GreetPeople("Jack", gd1);
}
///
/// 2.既然委托定义了方法, 所以委托也可以接受方法的赋值
///
private static void Method2()
{
GreetingDelegate gd1 = EnglishGreeting;
GreetingDelegate gd2 = ChineseGreeting;
GreetPeople("Jack", gd1);
GreetPeople("老王", gd2);
}
///
/// 1.最简单的调用方式
///
private static void Method1()
{
GreetPeople("Jimmy Zhang", EnglishGreeting);
GreetPeople("张子阳", ChineseGreeting);
}
}
}