委托在什么情况下使用void又在什么情况下使用返回值的呢

解决方案 »

  1.   

    在委托事件时使用void
    多播委托时必须使用void
      

  2.   

     一般是看要委托的方法``` 方法是什么返回类型 `` 什么参数```委托也就是什么了`````````````比如要为这样的方法声明委托```   string output(string str)
         {
           ````````````````` 
         }方法的返回值为sting类型,带一个sting类型的参数`````则声明的委托也就要这样声明```  delegate string mydelegate(string str);假如是为这样的方法```
       void output()
         {
           ````````````
         }
    则委托这样声明````
      delegate void mydelegate();
      

  3.   


            讲到委托,可能一些人对委托的概念还有些模糊。那么委托到底是什么呢?熟悉C或C++的朋友对函数指针应该相当清楚。C#里的委托与之就有同等功效,不过委托是面象对象的,类型安全的。简单的说,委托就是对方法的引用的一种手断。那么什么时候使用委托呢?有些情况下,我们需要在一个类中使用另一个类的方法。很多人能够想到的是,我在这个类中创建另一个类的一个实例,不就可以顺理成章的调用它的方法了么?事实上确实也是这样,但是。并非所有情况都可以这样做!!
            举个例子:我有一个主窗体(MainForm),由它创建并打开一个子窗体(SubForm)。我希望在子窗体上做某些操作的时候主窗体(MainForm)上的某些元素会发生变化。而这些变代并不要在等到关闭子窗体之后。比如,我希望在子窗体上双击某条数据,而该条数据就会自动被填写到主窗体的特定位置。想想这时候上叙的那种方法还会行得通吗?试都不会试,肯定是不行的。这时个委托就是最好的先择。可以在子窗体上定义一个委托,来指向主窗体上的一个方法。并在子窗体上双击了某条数据的时候执行这个委托。
          定义委托:以delegate关键字来定义委托,委托的签名跟方法的签名一样,有返回类型、委托名,参数。委托的实现在System.Delegate类中,所以。当定义了一个委托时,它自动从System.Delegate继承。也就是说:委托是只需要你定义就可以使用,而并不需要你去关心它的实现。下为委托定义示例:
    private delegate double MethodList(int _num1, int _num2);
    public delegate void MethodNull();
          从上面可以看出来,委托的签名与方法的签名一样,以什么样的签名形式定义委托,决定委托能接受哪种定义形式的方法。比如:上例中第一个委托能接受返回double类型,并且有两个int参数的方法。而第二个委托则接受不返回任何值,也没有任何参数的方法下面就以前面举的那个例子的需求来说演示一下委托的使用,要说明的是,我这里只演示关键的委托实现细节部分。并不将所有代码写出[我也没这样的精力(^_^)]。首先,我们看看在子窗体中的部份:
    ///比如我们定义CallMainFormMethod委托来执行主窗体上的方法
    public delegate void CallMainFormMethod(string _RsCode);
    public class SubForm : Form
    {
          public CallMainFormMethod ExeManFormMethod; //创建一个委托以执行方法
          public SubForm()
            {
                  InitializeComponent();
            }        ////这里是在dataGridView1上选中某行数据,并双击的时候执行委托。
            private void dataGridView1_DoubleClick(object sender, EventArgs e)
            {
                  if(this.dataGridView1.SelectedRows.Count > 0)
                  {
                        if(this.ExeManFormMethod != null) //这个主要防止在没有给委托传递方法时出错
                              this.ExeManFormMethod(this.dataGridView1.SelectedRows[0].Cells["DataCode"].Value.ToString());
                  }
            }
    }好现在来看看在主窗体MainForm中创建并打开子窗体(SubForm)时的代码:
    public class MainForm : Form
    {
          private SubForm __SubForm;      public MainForm()
          {
                InitializeComponent();
          }    private void AddData(string _dataCode)
        {
                ////此方法执行将数据录入到主窗体的特定位置
        }      ////创建并打开子窗体的事件
          private void mentItem1_Click(object sender, EventArgs e)
          {
                  if(this.__SubForm != null && !this.__SubForm.IsDisposed)
                        this.__SubForm.Dispose();
                  this.__SubForm = new SubForm();
                  this.__SubForm. ExeManFormMethod = new CallMainFormMethod(this.AddData);
                  this.__SubForm.Show();
          }
    }
    好了,实现前面所说例子的功能的原理大概就是这样。希望各位不要偷懒,详细理解这个演示所彩用的实现原理。然后自己写代码来实践一番。当然,委托的运用是很广泛的。我这里只是举了个及典型的例子,希望能给对委托概念尚不是很清淅的朋友一点线索。更多的运用还得各位自己在日后开发中跟据自己的理解自行变通。多播委托:
          也可以叫它多路委托,委托是一个可以接受与其签名形式相符的方法引用的列表。我们可以用一个委托指向多个方法,只要这些方法都位于同一个应用程序域,就不需要管它来自何处。多播委托是一次性执行多个方法非常有效并且简洁的手断。比如:我做在一个窗体上作操作,所希这个操作能响影已有的几个窗体,下在说明如何给委托添加多个方法和移除委托中已有的方法:
    以前面代码为基:////向委托添加多个方法
    this.__SubForm. ExeManFormMethod += new CallMainFormMethod(this.AddData);
    this.__SubForm. ExeManFormMethod += new CallMainFormMethod(this.InsertData);////向委托中移除方法
    this.__SubForm. ExeManFormMethod -= new CallMainFormMethod(this.AddData);
    this.__SubForm. ExeManFormMethod -= new CallMainFormMethod(this.InsertData);