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)

 

posted on 2015-01-14 11:35  优来忧往  阅读(178)  评论(0编辑  收藏  举报