C#中的委托和事件----1

48 阅读2分钟

委托

  • 委托是C#中由用户自定义的一个类型
  • 类表示的是数据和方法的集合,而委托实际上是一个能够持有对某个或某些方法的引用的类。
  • 与其它类不同,委托类能拥有一个签名,并且它只能持有与它的签名相匹配的方法引用。签名指的是返回类型和参数类型和个数。

如何使用委托

  1. 声明一个委托类型
  2. 使用该委托类型声明一个委托变量。
  3. 创建委托类型的对象,把它赋值给委托变量。该委托对象包含某个方法的引用,这个方法和第1步定义的签名一致。
  4. 为委托对象增加其它方法。
  5. 像调用方法一样调用委托。此时,委托持有的每一个方法都会依次执行。

image.png

声明委托

1.声明委托的语法与定义方法的语法相似,但是没有方法体,声明的前面加关键字delegate。 2.声明委托相当于声明一个新类,所以可以在任何声明类的相同地方声明委托,可以在另一个类的内部声明,也可以在任何类的外部声明。 3.可以在委托的声明上应用任意常见的访问修饰符,如public 、private

//委托的声明,其中TestDelegate是委托的名字 
public delegate void TestDelegate(int num);

//方法的声明
public          void TestMethod(int num)
{
    num=10;
}

创建对象

方式1:使用new 运算符的对象创建表达式。

TestDelegate td1=new TestDelegate(TestMethod);

方式2:直接用方法名进行创建

TestDelegate td2=TestMethod;

注意:方法可以来自任何类和结构,可以是实例方法,也可以是静态方法,只要方法的签名和委托的签名一致即可。

实例类EveryDayGreeting

internal class EveryDayGreeting
    {
        public void MorningGreeting(string name)
        {
            Console.WriteLine("Good Morning "+name);
        }

        public void NightGreeting(string name)
        {
            Console.WriteLine("Good Night "+name);
        }
    }

静态类FestivalGreeting

internal class FestivalGreeting
    {
        public static void ChrismasGreeting(string name)
        {
            Console.WriteLine("Happy Chrismas "+name);
        }

        public static void NewYearGreeting(string name)
        {
            Console.WriteLine("Happy New Year "+name);
        }
    }

委托类DelegateResolution应用

//需要搞明白委托类、委托变量、委托对象的概念
    //声明委托类
    public delegate void GreetingDelegate(string name);
    internal class Program
    {
        static void Main(string[] args)
        {
            //采用new关键字创建委托实例
            EveryDayGreeting everyDayGreeting = new EveryDayGreeting();
            //1.持有实例类方法
            //声明委托类型对象,并将其包含的方法引用赋值给委托变量
            GreetingDelegate greetingDelegate1 = new GreetingDelegate(everyDayGreeting.MorningGreeting);
            greetingDelegate1("xiaohu");
            GreetingDelegate greetingDelegate2 = new GreetingDelegate(everyDayGreeting.NightGreeting);
            greetingDelegate2("xiaoyang");
            //2.持有静态类方法
            GreetingDelegate greetingDelegate3 = new GreetingDelegate(FestivalGreeting.ChrismasGreeting);
            greetingDelegate1("xiaoming");
            GreetingDelegate greetingDelegate4 = new GreetingDelegate(FestivalGreeting.NewYearGreeting);
            greetingDelegate4("xiaonian");

            //采用方法名创建委托实例
            //3.持有实例类方法
            GreetingDelegate greetingDelegate5 = everyDayGreeting.MorningGreeting;
            greetingDelegate5("xiaozhao");
            GreetingDelegate greetingDelegate6 = everyDayGreeting.NightGreeting;
            greetingDelegate6("xiaoqian");
            //持有静态类方法
            GreetingDelegate greetingDelegate7 = FestivalGreeting.NewYearGreeting;
            greetingDelegate7("xiaosun");
            GreetingDelegate greetingDelegate8 = FestivalGreeting.ChrismasGreeting;
            greetingDelegate8("xiaoli");
            Console.Read();
        }
    }