欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#零基础学习理解委托

程序员文章站 2023-11-27 09:08:34
   说来惭愧,在大学的课程中,竟然没有听说过委托这个名称。那么今天我就带着大家一起探讨下委托和事件。 咱们先来看下委托 我主要从以下几个方面讲解...

   说来惭愧,在大学的课程中,竟然没有听说过委托这个名称。那么今天我就带着大家一起探讨下委托和事件。

咱们先来看下委托

我主要从以下几个方面讲解

1,  为什么使用委托  2.什么是委托  3.委托如何使用

为什么使用委托?

委托是c#中非常重要的一个概念,使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。与c或c++中的函数指针不同,委托是面向对象,而且是类型安全的。

什么是委托?

委托是一种引用方法的类型,一旦为委托分配了方法,委托将与该方法具有相同的行为,委托方法的使用和其他方法一样,具有参数和返回值。

如何使用委托

下面咱们就抛开枯燥的概念,来看几个活生生的例子是怎么使用委托的吧!

 案例1:中国人和英国人问好

 分析:1.首先我们需要编写一个中国人问好的方法和一个英国人问好的方法。

       2.编写一个greet方法,将问好方法作为一个参数,实现各个国家人的问好方法。

       3.使用委托实现各个国家人的问好功能

  使用委托分为三个步骤:1,定义委托  2.声明委托变量  3.使用委托

复制代码 代码如下:

      // 1.定义委托

       public delegate void greetdelegate(string name);

      class program

    {

        static void main(string[] args)

        {

                     //2.声明委托变量

 greetdelegate ddelegate = new greetdelegate(chinesegreeting);

//3.使用委托

            ddelegate("李小龙");

            console.readkey();

        }

//中国人问好方法

        public static void chinesegreeting(string name)

        {

            console.writeline("早上好!" + name);

        }

        //英国人问好方法

        public static void englishgreeting(string name)

        {

            console.writeline("morning!" + name);

        }

        public static void greet(string name, greetdelegate makegreet)

        {

            makegreet(name);

        }

  }


为了加深大家对委托的理解,我们再来写一个相似的例子。

案例2:翻译案例:通过委托将英文翻译为中文和韩文

复制代码 代码如下:

//01.声明一个委托类

public delegate void mytransdelegate(string words);

class program

    {

        static void main(string[] args)

        {

            //翻译方法

            //调用方法一

            //2.声明委托

            mytransdelegate del=new mytransdelegate(transtocn);

            //3.调用委托

            del("aa");

//调用方法二

            translate("aa",transtocn);

            //调用方式三

            //mytransdelegate del = transtocn;

            //del("aa");

             console.readkey();

        }

 

static  void translate(string str,mytransdelegate del)

        {

            del(str);

        }

        static void transtocn(string str)

        {

            console.writeline("翻译成中文了!");

        }

        static void transtokorean(string str)

        {

            console.writeline("翻译成韩语了!");

        }

}


通过这个案例,我们可以看出使用委托的方法不止一种,无论使用哪种方式,最终都和方式一一样。通过反编译我们可以证明:

如下图示我通过反编译看到方法二的代码:

C#零基础学习理解委托
 

如下是反编译后方法三的代码

C#零基础学习理解委托
 

有了上述知识存储,我们再来看一个案例:

案例3:通过委托将子窗体中的值传递到父窗体中

C#零基础学习理解委托

如图有父窗体和子窗体两个窗体,现在我想实现当点击父窗体中按钮时弹出子窗体(当然这个超级简单),在弹出子窗体后,在子窗体的文本框中输入内容,点击关闭按钮后子窗体关闭,并且将子窗体中输入的内容在父窗体的文本框中显示。

 

子窗体中代码如下:

复制代码 代码如下:

//定义委托

        public delegate void words(string words);

        //声明委托变量

        public words words;

        private void button1_click(object sender, eventargs e)

        {

            words(txtchild.text);

            this.close();

        }

父窗体中的代码:

private void btnopen_click(object sender, eventargs e)

        {

            child child = new child();

            child.words = getwords;

            child.show();

        }

        public void getwords(string str)

        {

            txtmain.text = str;

        }


我们来分析下上述两断代码:

首先,我们想在子窗体关闭时,更新父窗体文本框中的数据。但是我们非常清楚的知道,窗体之间的空间是不能直接相互访问的,这时我们就要找一个中介帮我们实现父窗体数据的更新功能。于是我们定义了带一个参数没有返回值的委托words,并且在父窗体中定义了一个方法getwords符合委托的条件。于此同时,在子窗体中声明了一个委托变量words,并且在关闭按钮中,调用了委托变量。

但在子窗体中我们没有对子窗体委托变量赋值,真正的赋值放到了主窗体中。这样通过委托就实现了在子窗体中调用父窗体的方法,进而实现了父窗体文本框内容的更新。

   不知道,看过上述3个案例,大家对委托有没有一个相对清晰的认识,如果本文能帮助迷途中的你,那就更好了。