C#之委托

委托:

讲到委托,可能一些人对委托的概念还有些模糊。那么委托到底是什么呢?熟悉C或C++的朋友对函数指针应该相当清楚。C#里的委托与之就有同等功效,不过委托是面象对象的,类型安全的。简单的说,委托就是对方法的引用的一种手断。那么什么时候使用委托呢?有些情况下,我们需要在一个类中使用另一个类的方法。很多人能够想到的是,在这个类中创建另一个类的一个实例,不就可以顺理成章的调用它的方法了么?事实上确实也是这样,但是。并非所有情况都可以这样做!!

举个例子:有一个主窗体(MainForm),由它创建并打开一个子窗体(SubForm)。我希望在子窗体上做某些操作的时候主窗体(MainForm)上的某些元素会发生变化。而这些变代并不要在等到关闭子窗体之后。比如,我希望在子窗体上单击某个按钮,而该textbox的数据就会自动被填写到主窗体的特定位置。想想这时候上叙的那种方法还会行得通吗?试都不会试,肯定是不行的。这时个委托就是最好的先择。可以在子窗体上定义一个委托,来指向主窗体上的一个方法。并在子窗体上双击了某条数据的时候执行这个委托。

定义委托:以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 partial class SubForm : Form

{

public CallMainFormMethod ExeManFormMethod; //创建一个委托以执行方法

public SubForm()

{

InitializeComponent();

}

private void ShowData_Click(object sender, EventArgs e)

{

if(txt_info.Text!=null)

{

if (this.ExeManFormMethod != null) //这个主要防止在没有给委托传递方法时出错

this.ExeManFormMethod(txt_info.Text);

}

}

}

好现在来看看在主窗体MainForm中创建并打开子窗体(SubForm)时的代码:

public partial class MainForm : Form

{

private SubForm __SubForm;

public MainForm()

{

InitializeComponent();

}

private void AddData(string _dataCode)

{

txt_info.Text = _dataCode;//此方法执行将数据录入到主窗体的特定位置

}

//创建并打开子窗体的事件

private void ShowSubForm_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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CSICSICSICSI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值