2012年3月12日 天气阴 蛋疼的一天
为什么有委托
希望能够调用一个函数,但是写程序的时候不用知道调用的是哪个函数,只要能传参数,取返回值就可以。
委托的使用
声明委托的方式:delegate 返回值类型 委托类型名(参数)
比如delegatevoid StringProcess(string s);
注意这里的除了前面的delegate,剩下部分和声明一个函数一样,但是StringProcess不是函数名,而是委托类型名
比如delegatevoid StringProcess(string s);
注意这里的除了前面的delegate,剩下部分和声明一个函数一样,但是StringProcess不是函数名,而是委托类型名
声明的委托是一种类型,就像int、Person一样,如果要用的话还要声明委托类型的变量,声明委托类型变量的方式:StringProcessf1;
将委托类型变量指向函数StringProcess sp = newStringProcess(SayHello),这样就可以像调用普通函数一样把sp当成函数用了。委托可以看做是函数的指针。整数可以用整数变量指向它,对象可以用对象变量指向它,函数也可以用委托变量指向它。和直接调用函数的区别:用委托就可以指向任意的函数,哪怕是之前没定义的都可以,而不使用受限于那几种。
将委托类型变量指向函数还可以简化成StringProcess sp = SayHello,编译器帮我们进行了new。但是不能sp=PrintIt(),因为这样就成了“执行PrintIt函数,并且将sp指向PrintIt的返回值”。
事件注意:
委托测试:
建立一个windows应用程序
创建一个用户控件,代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace 委托事件验证控件
{
public partial class shanqiangControl : UserControl
{
private int Count=0;
//定义委托对象
private shanqianDelegate shanqian;
public void AddshanqianEvents(shanqianDelegate v)
{
shanqian += v;
}
//用事件操作委托,用add,remove和上面定义的私有委托变量混合用
//public event shanqianDelegate shanqian1
//{
// add
// {
// shanqian += value;
// }
// remove
// {
// shanqian -= value;
// }
//}
//也可以不用add,remove
public event shanqianDelegate shanqian1;
public shanqiangControl()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Count++;
if (Count == 3)
{
Count = 0;
//用add,remove方法的调用这个委托变量
//if (shanqian != null)
//{
// shanqian();
//}
//不用add,remove方法者,直接用事件操作
if (shanqian1 != null)
{
shanqian1();
}
}
}
}
//定义委托
public delegate void shanqianDelegate();
}
在form中调用,代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace 委托事件验证控件
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
validateText1.validate = validateUser;
//通过委托添加删除方法
//shanqiangControl1.AddshanqianEvents(onshanqian);
//通过事件添加删除方法
shanqiangControl1.shanqian1 += onshanqian;
}
void onshanqian()
{
// testc();
MessageBox.Show("bingo!!");
}
}
}
事件注意:
事件语法:event ProcessWordDelegate{add{...},remove{...}}add、remove和属性、索引一样最终都编译成两个方法。
如果是简单的增加委托,没有特殊的判断逻辑可以简写,一般情况下都是简写。
加了event关键字实现事件机制的好处:用了event事件,不可以修改事件已经注册的值;不可以冒充进行事件通知了。在IntUC类外部就不能通过OnInt(3)的方式调用注册的委托了。只能+=、-=!
委托测试:
建立一个windows应用程序
创建一个用户控件,代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace 委托事件验证控件
{
public partial class shanqiangControl : UserControl
{
private int Count=0;
//定义委托对象
private shanqianDelegate shanqian;
public void AddshanqianEvents(shanqianDelegate v)
{
shanqian += v;
}
//用事件操作委托,用add,remove和上面定义的私有委托变量混合用
//public event shanqianDelegate shanqian1
//{
// add
// {
// shanqian += value;
// }
// remove
// {
// shanqian -= value;
// }
//}
//也可以不用add,remove
public event shanqianDelegate shanqian1;
public shanqiangControl()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Count++;
if (Count == 3)
{
Count = 0;
//用add,remove方法的调用这个委托变量
//if (shanqian != null)
//{
// shanqian();
//}
//不用add,remove方法者,直接用事件操作
if (shanqian1 != null)
{
shanqian1();
}
}
}
}
//定义委托
public delegate void shanqianDelegate();
}
在form中调用,代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace 委托事件验证控件
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
validateText1.validate = validateUser;
//通过委托添加删除方法
//shanqiangControl1.AddshanqianEvents(onshanqian);
//通过事件添加删除方法
shanqiangControl1.shanqian1 += onshanqian;
}
void onshanqian()
{
// testc();
MessageBox.Show("bingo!!");
}
}
}