马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

C#委托什么时候会用到?

  [复制链接]
查看9365 | 回复9 | 2016-7-25 09:53:15 | 显示全部楼层 |阅读模式
对一般初学者而言,学到一种技术的时候,不知道什么时候会用到,楼主今天逛博客园的时候刚好看到此文章,特此转载过来。


C#中什么时候会用到委托?

    初学.Net的同学们,我们常常会有这样一种感觉,对于一项技术,或者一个方法,我们都知道它很有用,可就是用不着,或者说,并不知道什么地方能用的上,所以,技术学会了,却用不上,也就无法深入。时间一长,就容易忘,结果就是,这个我学过,那个我也懂,可是我就不会用。。。

  前段时间,做了一个局域网通讯工具的项目,在其中涉及到修改个人资料的模块上,遇到了一个有些意思的问题,就是,当用户在修改资料的窗体修改完个人头像的时候,如何让主窗体也随之更新头像,这里,我想到几种方法,第一,用多线程,第二,C#的Timer定时器,这两种方法,其实都是让程序每隔一定的时间刷新一下用户头像,确定可行,不过,用线程来做,实在有点小题大做,而且也涉及到线程间窗体调用的检查,觉得得不尝失,而定时器——老依靠控件并非明智之举吧。何况我们有更好的办法,对,就是委托。

  在学C#时,我们都知道,委托是一个变量,可以把方法名当做一个值赋给它,这样,我们就可以用这个委托变量来调用这个方法。当初在学的时候,相信大家都有感触:明明调用一下方法就可以完成的事,为什么又要搞个委托,绕个弯呢?

  实际上,在很多情况下,我们并不能直接的调用方法,可能这个方法是private类型的,但又需要在外部来调用它,这时,就可以用委托来调用,下面举一个例子来

C#委托什么时候会用到?IBC编程社区,www.ibcibc.com,C#论坛

C#委托什么时候会用到?IBC编程社区,www.ibcibc.com,C#论坛






  这个程序,是在Form2中点击选择图片,打开一个对话框后,选择相应图片,然后在Form1上显示。这里是在Form1中定义一个方法,方法是通过传入的参数来修改本窗体的背景图片,这个方法是private类型的,在Form2中是访问不到的,那么,就可以在Form1中定义一个委托和委托变量,然后把方法名赋值给它,当Form2中选择完图片后,执行调用该委托,就可以执行这个方法,完成Form1窗体背景的修改,下附代码:


[C#] 纯文本查看 复制代码
[/b][/color][/size]
public partial class Form1 : Form
    {        /// <summary>
        /// 定义一个显示图片的委托
        /// </summary>
        /// <param name="img"></param>
        public delegate void ShowPicture(Image img);

        /// <summary>
        /// 定义委托类型的变量
        /// </summary>
        public static ShowPicture OnPicSaved;
        public Form1()
        {
            InitializeComponent();
            OnPicSaved = ShowIt;//给变量赋值
        }

        /// <summary>
        /// 修改窗体背景颜色的方法
        /// </summary>
        /// <param name="img"></param>
        private void ShowIt(Image img)
        {
            this.BackgroundImage = img;
        }
    } 

  Form2中的代码如下:
 
    public Form2()
    {
        InitializeComponent();
        Form1 frm1 = new Form1();
        frm1.Show();//显示Form1窗体
    }
    private void btnSelImg_Click(object sender, EventArgs e)
    {
        if (null == openFileDialog1.ShowDialog())//打开对话框
        {
            return;
        }
        //让窗体中的PictureBox显示图片
        picBoxShow.Image = Image.FromFile(openFileDialog1.FileName);
        //调用Form1中的委托,更改Form1背景颜色
        Form1.OnPicSaved(picBoxShow.Image);
    }
} [size=4][color=#ff0000][b]



    就本人的理解,实现一个功能可以用很多方法,每一种方法代表一种思想,一种理念,对于这个例子,我们可以用线程或者定时器来做,让Form1不断的去判断Form2是否选择了新图片,如果是,我就改。而用委托,则主动权交给了Form2,Form2选择了图片,来告诉我,我再改。没有最好的方法,只有最合适的方法。比如在局域网用Socket通信时,同步阻止模式下,就需要开一个线程来处理与其他用户的会话,这时选择的是线程,而非委托。



C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
ibcadmin | 2016-7-25 09:57:13 | 显示全部楼层
111
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
即墨还雀 | 2016-7-25 09:58:07 | 显示全部楼层
火钳学习
IBC-花溪 | 2016-7-25 10:00:55 | 显示全部楼层
是不是定义一个属性也可以做啊
剑弑 | 2016-7-25 10:05:27 | 显示全部楼层
楠哥,这是一种用法,但我觉得应用比较多的应该是在架构上
ibcadmin | 2016-7-25 10:07:26 | 显示全部楼层
IBC-花溪 发表于 2016-7-25 10:00
是不是定义一个属性也可以做啊

啥意思
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
ibcadmin | 2016-7-25 10:08:07 | 显示全部楼层
剑弑 发表于 2016-7-25 10:05
楠哥,这是一种用法,但我觉得应用比较多的应该是在架构上

恩 其实我自己也很少用啦

点评

我也很少用到  详情 回复 发表于 2016-7-25 10:09
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
剑弑 | 2016-7-25 10:09:11 | 显示全部楼层
ibcadmin 发表于 2016-7-25 10:08
恩 其实我自己也很少用啦

我也很少用到
卖烤地瓜的 | 2016-7-25 10:15:36 | 显示全部楼层
打酱油啊 打酱油 打了几斤回家血浆鸭吃
ibcadmin | 2016-7-25 10:46:28 | 显示全部楼层
卖烤地瓜的 发表于 2016-7-25 10:15
打酱油啊 打酱油 打了几斤回家血浆鸭吃

...
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则