zoukankan      html  css  js  c++  java
  • 第16节、C#委托与事件

    1、C#委托理解

    看标题便疑问:

    1. 委托是什么?
    2. 为什么需要委托?
    3. 委托能用来做什么?
    4. 如何定义委托?怎么使用?

    参考回答

             1、顾名思义,让别人协助帮忙你处理某件事情,其实际意义便是让别人代理你的事情。

             2、使用关键字delegate关键字声明委托

    委托(Delegate)特别用于实现事件和回调方法,所有的委托都派生自System.Delegate类。

    2、C#委托定义

    委托声明决定了可由该委托引用的方法,委托可指向一个与具有相同标签的方法。

    修饰符 delegate 返回类型 委托名(形参);
    
    • 委托声明与接口方法差不多,只是返回类型前多一个delegate关键字,修饰符一般是public类型,因为供别人调用。
    • 委托本质也是一个类型。我们声明一个类可以实例化、同时委托也可以实现实例。

    示例:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace 控制台应用
    {
        public delegate void MyDelegatehl(string name);//声明委托
        public class 委托
        {
            public void GetPrint(string name)
            {
                Console.WriteLine("问候:你好:{0}", name);
            }
        }
    
         /// <summary>
        /// 控制台输出
        /// </summary>
        public class TestProgramA
        {
            public static void Main(string[] args)
            {
                委托 wtl = new 委托();
                MyDelegatehl dl = wtl.GetPrint;
                dl("小明");
                Console.ReadKey();
            }
        }
    }

    输出:问题:你好:小明

    2、多播委托

    包含多个方法的委托叫做多播委托。using System;

    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace 控制台应用
    {
        public delegate void MyDelegate(string name);//声明委托
        public class 多播委托
        {
            public void GetPrint(string name)
            {
                Console.WriteLine("问候:你好:{0}",name);
            }
    
            public void GetPrint2(string name)
            {
                Console.WriteLine("问候:早上好:{0}", name);
            }
    
            //委托相对参数类型
            public void GetPrints(MyDelegate mydele, string name)
            {
                mydele(name);
            }
        }
    
        /// <summary>
        /// 控制台输出
        /// </summary>
        public class TestProgram
        {
            public static void Main(string[] args)
            {
                多播委托 wtl = new 多播委托();
    
                //方式一:
                MyDelegate dl1, dl2;               //理解委托就是数据类型,给数据赋值(把方法理解为参数值)
                dl1 = wtl.GetPrint;
                dl2 = wtl.GetPrint2;
                dl1("张三");
                dl2("李四");
                Console.WriteLine();
    
                //方式二           
                MyDelegate dl3 = wtl.GetPrint;    //委托可以是要+=/-=赋值与移除,如果参数值一样的两个方法就可以是要+=,-=
                dl3 += wtl.GetPrint2;
                dl3("王五");
                Console.WriteLine();
    
                //方式三                          //理解方式一,方法参数返回值与委托一致,都可以存到同一个委托上,理解委托是个类型,就可以什么一个方法GetPrints(委托类型,值)的方法
                MyDelegate dl4 = wtl.GetPrint;
                wtl.GetPrints(dl4, "张三");
                MyDelegate dl5 = wtl.GetPrint2;
                wtl.GetPrints(dl5, "李四");
                Console.WriteLine();
    
                //方式四
                MyDelegate dl6 = wtl.GetPrint;    //委托可以是要+=/-=赋值与移除,如果参数值一样的两个方法就可以是要+=,-=
                dl6 += wtl.GetPrint2;
                wtl.GetPrints(dl6, "王五");
    
                Console.ReadKey();
            }
        }
    }

    输出:

    问候:你好:张三
    问候:早上好:李四

    问候:你好:王五
    问候:早上好:王五

    问候:你好:张三
    问候:早上好:李四

    问候:你好:王五
    问候:早上好:王五

    3、事件声明

    示范:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace 控制台应用
    {
        public delegate void MyDelegate1();   //声明委托无参
        public delegate void MyDelegate2(string name);   //声明委托有参
        public class 委托_事件
        {
           public event MyDelegate1 MyEvent;  //声明事件无参
           public event MyDelegate2 MyEvent2;  //声明事件有参
    
           public void GetPr()
           {
               if (MyEvent != null)          //判断事件非空
               {
                   MyEvent();                //执行事件,即是执行添加事件中委托的方法
               }
           }
    
    
           public void GetPr2(string name)
           {
               if (MyEvent2 != null)          //判断事件非空
               {
                   MyEvent2(name);                //执行事件,即是执行添加事件中委托的方法
               }
           }
        }
    }

    4、委托与事件

    示范:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace 控制台应用
    {
       public class 委托和事件
        {
           public static void Main(string[] args)
           {
               委托_事件 wt1 = new 委托_事件();      //实例对象
               wt1.MyEvent += GetPrint;     //给对象事件家方法
               wt1.MyEvent += GetPrint2;
               wt1.GetPr();                 //执行
               Console.WriteLine();
               wt1.MyEvent2 += GetPrint;     //给对象事件家方法
               wt1.MyEvent2 += GetPrint2;
               wt1.GetPr2("王五");                 //执行
               Console.ReadKey();
           }
    
            public static void GetPrint()
            {
                Console.WriteLine("问候:你好:张三");
            }
    
            public static void GetPrint2()
            {
                Console.WriteLine("问候:早上好:李四");
            }
    
    
            public static void GetPrint(string name)
            {
                Console.WriteLine("问候:你好:{0}", name);
            }
    
            public static void GetPrint2(string name)
            {
                Console.WriteLine("问候:早上好:{0}",name);
            }
    
        }
    }

    输出

    问候:你好:张三
    问候:早上好:李四

    
    

    问候:你好:王五
    问候:早上好:王五

  • 相关阅读:
    Web Workers 的基本信息
    关于前端框架的一些观点
    解密jQuery内核 DOM操作方法(二)html,text,val
    解密jQuery内核 DOM操作
    解密jQuery内核 DOM操作的核心buildFragment
    解密jQuery内核 DOM操作的核心函数domManip
    前端MVC框架Backbone 1.1.0源码分析(二)
    前端MVC框架Backbone 1.1.0源码分析(一)
    解密jQuery内核 Sizzle引擎筛选器
    解密jQuery事件核心
  • 原文地址:https://www.cnblogs.com/liuzz/p/14532951.html
Copyright © 2011-2022 走看看