ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Delegates 学习简记一

Delegates 学习简记一

原创 Linux操作系统 作者:kirinri 时间:2009-03-24 17:25:53 0 删除 编辑
Normal 0 false false false MicrosoftInternetExplorer4 Delegates 学习简记

 

学习了同袍的一篇日志和博客园-张子阳的日志后记下自己的内容。

 

    袍:http://www.cnblogs.com/cuihongyu3503319/archive/2009/03/13/1411059.html

张子阳:http://www.cnblogs.com/JimmyZhang/archive/2007/09/23/903360.html

 

关于委托:

我有几个问题,

  1. 委托是什么?
  2. 为啥需要委托呢?
  3. 咋用呢?

 

委托是什么?

  在C#中,委托是一种可以把引用存储为函数的类型。

  委托的声明非常类似于函数,但不带函数体,且要使用delegate关键字。

  委托的声明指定了一个函数签名,其中包含一个返回类型和参数列表。

  在定义了委托后,就可以声明该委托类型的变量。

  接着将这个变量初始化为与该委托有相同签名的函数引用。

之后,就可以使用委托变量调用这个函数,就像 该变量是一个函数一样。

 

为啥需要委托呢?

 

例子:“只说一句话”

Program.cs

using System;

using System.Collections.Generic;

using System.Text;

 

namespace DelegatesTest

{

    class Program

    {

        static void Main(string[] args)

        {

            GreetPeople gp = new GreetPeople();

 

            // say english function

            gp.GreetingPeople("nameTest");

           

        }

    }

}

 

 

 

 

 

GreetPeople.cs

using System;

using System.Collections.Generic;

using System.Text;

 

namespace DelegatesTest

{

    class GreetPeople

    {

        // function

        public void GreetingPeople(string name)

        {

            EngGreeting(name);

        }

 

        // say english function

        public void EngGreeting(string name)

        {

            Console.WriteLine("english---> Morning " + name);

        }

 

        // say chinese function

        public void ChiGreeting (string name)

        {

            Console.WriteLine("chinese---> 干啥呢?" + name);

        }

    }

}

 

english---> Morning nameTest

Press any key to continue . . .

 

如果要多种语言呢?代码:

Program.cs

 

using System;

using System.Collections.Generic;

using System.Text;

 

namespace DelegatesTest

{

    class Program

    {

        static void Main(string[] args)

        {

            GreetPeople gp = new GreetPeople();

 

            // say english function

            gp.GreetingPeople("nameTest");

 

            gp.GreetingPeople("english", language.Eng);

 

            gp.GreetingPeople("chinese", language.Chi);

            

        }

    }

}

 

GreetPeople.cs

 

using System;

using System.Collections.Generic;

using System.Text;

 

namespace DelegatesTest

{

 

    public enum language

    {

        Eng,Chi

    }

 

    class GreetPeople

    {

        // function

        public void GreetingPeople(string name)

        {

            EngGreeting(name);

        }

        // new add function

        public void GreetingPeople(string name, language lan)

        {

            // check language

            switch (lan)

            {

                case language.Eng:

                    EngGreeting(name);

                    break;

                case language.Chi:

                    ChiGreeting(name);

                    break;

            }

        }

 

        // say english function

        public void EngGreeting(string name)

        {

            Console.WriteLine("english---> Morning " + name);

        }

 

        // say chinese function

        public void ChiGreeting(string name)

        {

            Console.WriteLine("chinese---> 干啥呢?" + name);

        }

    }

}

 

english---> Morning nameTest

english---> Morning english

chinese---> 干啥呢? chinese

Press any key to continue . . .

 

如果需求增加switch会改动

            gp.GreetingPeople("englisth", language.Eng);

 

            gp.GreetingPeople("chinese", language.Chi);

中的enum也会随之改动。

如果public void GreetingPeople(string name, ●●●●●MakeGreeting);第二个参数是方法名或是指到方法自己就好了!

 

Program.cs

using System;

using System.Collections.Generic;

using System.Text;

 

namespace DelegatesTest

{

    class Program

    {

        static void Main(string[] args)

        {

            GreetPeople gp = new GreetPeople();

 

            // say english function

            gp.GreetingPeople("nameTest");

 

            // select say english

            gp.GreetingPeople("english", language.Eng);

 

            // select say chinese

            gp.GreetingPeople("chinese", language.Chi);

 

            Console.WriteLine("-------------delegate-----function---------------------");

 

            // delegate say english function

            gp.GreetingPeople("delegate english", gp.EngGreeting);

            // delegate say chinese function

            gp.GreetingPeople("delegate chinese", gp.ChiGreeting);

           

        }

    }

}

 

 

GreetPeople.cs

using System;

using System.Collections.Generic;

using System.Text;

 

namespace DelegatesTest

{

    public delegate void GreetingDelegate(string name);

    public enum language

    {

        Eng,Chi

    }

 

    class GreetPeople

    {

        // Only english function

        public void GreetingPeople(string name)

        {

            EngGreeting(name);

        }

        // Select function

        public void GreetingPeople(string name, language lan)

        {

            // check language

            switch (lan)

            {

                case language.Eng:

                    EngGreeting(name);

                    break;

                case language.Chi:

                    ChiGreeting(name);

                    break;

            }

        }

 

        // Delegate function

        public void GreetingPeople(string name, GreetingDelegate MakeGreeting)

        {

            MakeGreeting(name);

        }

 

 

 

        // say english function

        public void EngGreeting(string name)

        {

            Console.WriteLine("english---> Morning " + name);

        }

 

        // say chinese function

        public void ChiGreeting(string name)

        {

            Console.WriteLine("chinese---> 干啥呢?" + name);

        }

    }

}

english---> Morning nameTest

english---> Morning english

chinese---> 干啥呢? chinese

-------------delegate-----function---------------------

english---> Morning delegate english

chinese---> 干啥呢? delegate chinese

Press any key to continue . . .

 

记:

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用判断语句,使程序具有更好的可扩展性。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12476590/viewspace-578172/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2007-12-21

  • 博文量
    257
  • 访问量
    497808