zoukankan      html  css  js  c++  java
  • 委托

    委托是类型
    所以,委托在创建委托变量以及引用之前要先声明。
    delegate void MyDel(int i)//声明委托 -------------声明了接受不返回值 并且接受参数为单个int类型参数方法
     
    委托可以使用操作符进行组合,组合出的委托对象没有被改变,委托被创建出来后不在改变
    何时使用委托
     

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

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

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

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

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

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

    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);

    }

    }

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

  • 相关阅读:
    Write an algorithm such that if an element in an MxN matrix is 0, its entire row and column is set to 0.
    旋转二维数组
    replace empty char with new string,unsafe method和native implementation的性能比较
    判断一字符串是否可以另一字符串重新排列而成
    移除重复字符的几个算法简单比较
    也来纠结一下字符串翻转
    判断重复字符存在:更有意义一点
    程序员常去网站汇总
    sublime
    针对程序集 'SqlServerTime' 的 ALTER ASSEMBLY 失败,因为程序集 'SqlServerTime' 未获授权(PERMISSION_SET = EXTERNAL_ACCESS)
  • 原文地址:https://www.cnblogs.com/xtt321/p/3226731.html
Copyright © 2011-2022 走看看