zoukankan      html  css  js  c++  java
  • C# 委托和事件

    一直对委托和事件有种畏惧感,刚开始入门C#时,很怕去触碰它,现在有些理解了,写下作为一个学习过程中的笔记,防止忘记

    委托就是将方法作为一个参数传递。有调用的方法参数决定执行哪一个方法。看例子是最能够快速理解方法的,我们来比较一下两种方法实现同一种功能:根据名字决定使用哪种语言问候语。例如,如果名字name 为Jim,则显示 hello, 如果名字为 张阳,则显示为你好。

    首先来看不使用委托的代码情况

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace 委托和事件
    {
        class Program
        {
    
            private enum Language { English, Chinese }
            static void Main(string[] args)
            {
                string name1, name2;
                name1 = "Miya";
                name2 = "";
                GreetPeople(name1, Language.English);
                GreetPeople(name2, Language.Chinese);
                Console.ReadKey();
            }
            static void GreetPeople(string name, Language lang)
            {
                switch (lang)
                {
                    case Language.English:
                        EnglishGreeting(name);
                        break;
                    case Language.Chinese:
                        ChineseGreeting(name);
                        break;
                }
    
            }
            static void EnglishGreeting(string name)
            {
                Console.WriteLine("Morning," + name);
            }
            static void ChineseGreeting(string name)
            {
                Console.WriteLine("早上好," + name);
            }
    
            
    
        }
    }

    我们会发现,使用该方法也能实现此功能,但是可扩展性很差,未来如果还有使用其他语言的国家,则需要修改GreetPeople方法,以适应新的需求。这时可以考虑使用委托

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace 委托和事件
    {
        public delegate void GreetingDelegate(string name);
        public class Program
        {
    
            static void Main(string[] args)
            {
                string name1, name2;
                name1 = "Miya";
                name2 = "";
                GreetPeople(name1, EnglishGreeting);
                GreetPeople(name2, ChineseGreeting);
                Console.ReadKey();
            }
    
            static void EnglishGreeting(string name)
            {
                Console.WriteLine("Morning," + name);
            }
            static void ChineseGreeting(string name)
            {
                Console.WriteLine("早上好," + name);
            }
            private static void GreetPeople(string name, GreetingDelegate MakeGreeting)
            {
                MakeGreeting(name);
            }
    
        }
    }

    这样使用委托后,将方法作为参数传给GreetPeople 即MakeGreeting 参数,而GreetingDelegate是一种委托类型

    委托的使用要先定义一种委托类型 GreetingDeletate

    1 定义委托类型 :public delegate void GreetingDelegate(string name);

    2 声明委托 GreetingDelegate MakeGreeting
    3 调用委托 GreetPeople(name1, EnglishGreeting)

  • 相关阅读:
    7月的尾巴,你是XXX
    戏说Android view 工作流程《下》
    “燕子”
    Android开机动画bootanimation.zip
    戏说Android view 工作流程《上》
    ViewController里已连接的IBOutlet为什么会是nil
    My first App "Encrypt Wheel" is Ready to Download!
    iOS开发中角色Role所产生的悲剧(未完)
    UIScrollView实现不全屏分页的小技巧
    Apple misunderstood my app,now my app status changed to “In Review”
  • 原文地址:https://www.cnblogs.com/MiyaQian/p/4223525.html
Copyright © 2011-2022 走看看