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)

  • 相关阅读:
    CI框架 -- 核心文件 之 Loader.php(加载器)
    CI框架 -- 核心文件 之 Lang.php(加载语言包)
    CI框架 -- 核心文件 之 Input.php(输入数据处理文件)
    CI框架 -- 核心文件 之 Hooks.php
    CI框架 -- 核心文件 之 Exceptions.php
    CI框架 -- 配置文件config.php
    网站后台发通知页面效果图
    校内通知-Notifications表增加老师,家长,学生发送范围字段
    jqGrid设置指定行的背景色
    SQLServer数据库监控代码
  • 原文地址:https://www.cnblogs.com/MiyaQian/p/4223525.html
Copyright © 2011-2022 走看看