• C#3.0委托之委托变量的使用实例


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

      这博客园的第一篇博文,就从C#委托开始吧。

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

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

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

                

                  

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

    [csharp] 
    1. public partial class Form1 : Form  
    2.     {  
    3.    
    4.         /// <summary>  
    5.         /// 定义一个显示图片的委托  
    6.         /// </summary>  
    7.         /// <param name="img"></param>  
    8.         public delegate void ShowPicture(Image img);  
    9.    
    10.         /// <summary>  
    11.         /// 定义委托类型的变量  
    12.         /// </summary>  
    13.         public static ShowPicture OnPicSaved;  
    14.    
    15.         publicForm1()  
    16.         {  
    17.             InitializeComponent();  
    18.    
    19.             OnPicSaved = ShowIt;//给变量赋值  
    20.         }  
    21.    
    22.         /// <summary>  
    23.         /// 修改窗体背景颜色的方法  
    24.         /// </summary>  
    25.         /// <param name="img"></param>  
    26.         private void ShowIt(Image img)  
    27.         {  
    28.             this.BackgroundImage = img;  
    29.         }  
    30.     }  


    Form2中的代码如下:

    [csharp] 
    1. publicForm2()  
    2.     {  
    3.         InitializeComponent();  
    4.         Form1 frm1 = new Form1();  
    5.         frm1.Show();//显示Form1窗体  
    6.     }  
    7.    
    8.    
    9.     privatevoid btnSelImg_Click(objectsender, EventArgs e)  
    10.     {  
    11.         if(null== openFileDialog1.ShowDialog())//打开对话框  
    12.         {  
    13.             return;  
    14.         }  
    15.    
    16.         //让窗体中的PictureBox显示图片  
    17.         picBoxShow.Image = Image.FromFile(openFileDialog1.FileName);  
    18.    
    19.         //调用Form1中的委托,更改Form1背景颜色  
    20.         Form1.OnPicSaved(picBoxShow.Image);  
    21.     }  
     

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

    此实例引用其他人,看到此实例对我的理解有很大的帮助,我就转载过来了 - - 

      

  • 相关阅读:
    Devexpress 控件的BUG, Visual studio 2008(vb.net)编辑器的BUG,或是?
    什么是Dropthings
    希言的日志开张啦
    Application Architecture Guide 2.0 (Chapter 7: Quality Attributes) Part 2
    Application Architecture Guide 2.0 (Chapter 7: Quality Attributes) Part 3
    Application Architecture Guide 2.0 (Chapter 7: Quality Attributes) Part 5
    Application Architecture Guide 2.0 (Chapter 7: Quality Attributes) Part 1
    使用自定义色系美化JfreeChart图表
    Application Architecture Guide 2.0 (Chapter 7: Quality Attributes) Part 4
    [WPF]TextTrimming截断后,ToolTip显示完整信息
  • 原文地址:https://www.cnblogs.com/wang726zq/p/delegate.html
Copyright © 2020-2023  润新知