委托
委托(delegate)“一个函数赋值给一个委托变量后,调用这个委托等价于调用那个函数
委托就是能存放符合签名方法指针的容器
- 委托是一种数据类型,引用类型,像类一样(可以声明委托类型变量)
- 使用委托的时候必须new一个委托对象,即使看到的代码没有new委托对象,编译器也会在编译时
帮我们new赋值给委托的方法,其实是存储在委托对象中的 - 委托(在代码中动态嵌入一个方法)使用的步骤:
1>定义一个委托类型
public delegate void form2delegate();
2>声明一个委托变量
form2delegate wd=new form2delegate(方法名);
3>调用委托
if(wd !=null){
//调用委托
wd();
或wd.Invoke();
} - 什么情况下用委托?委托有什么用?
1.有一段代码
2.变化(当一个类型中需要嵌入一段代码,但是这段代码具有不确定性,是根据使用这个类型的用户来确定代码的,这种情况下就可以在该类型中,使用一个委托,保证在某种情况下调用这个委托,
这时,用户将对应的方法传递给该委托,则就会调用这个方法)
自定义控件中的事件会大量使用到委托(写事件的时候会用到委托)
//可以把静态方法或私有方法赋值到委托变量,赋值后能使用到该委托变量的地方
就能使用该方法
–匿名方法: myDelegate md=delegate(){ console…};
调用: md();
public delegate void myDelegate();
–事件 :委托可以实现事件所有功能时代
事件就是委托封装了add和remove方法,不会让别人捣乱 本质还是委托
定义事件之前要定义委托;
public delegate void myTriplechick();
public event myTriplechick Tirpclick;
事件只能使用+=或-=赋值,避免使用=赋值时覆盖问题
/
委托和事件区别:委托是类型,事件是对象,相当于一个委托的变量(可以理解为对委托变量的封装(私有委托)),
委托可以在外部调用,可以用=号赋值,事件只能在定义事件的内部来调用,只能用+=或-=赋值,委托可以实现件的所有功能,事件相对于对委托做了一个限制。
/
事件作用与委托变量一样。
–程序集(exe,dll):类型元数据(代码中每一个类型和成员),程序集元数据(程序集清单),IL代码,资源文件
可以通过Assmblyinfo.cs文件来定义
namespace 委托
{
class Program
{
public delegate void DGSay();//声明委托类
public delegate void DGsay2(string msg);
static void Main(string[] args)
{
DGSay saydelegate = new DGSay(say);//方法放进去
saydelegate();
DGsay2 say2delegat = new DGsay2(say2);
say2delegat("11");
Console.ReadKey();
}
static void say()
{
Console.WriteLine("你好");
}
static void say2(string msg)
{
Console.WriteLine(msg);
}
}
}
三界面同步Demo
委托当参数
//定义委托,它定义了可以代表的方法的类型
public delegate void GreetingDelegate(string name);
class Program {
private static void EnglishGreeting(string name) {
Console.WriteLine(”Morning, ” + name);
} Www~
private static void ChineseGreeting(string name) {
Console.WriteLine(”早上好, ” + name);
}
//注意此方法,它接受一个GreetingDelegate类型的方法作为参数
private static void GreetPeople(string name, GreetingDelegate MakeGreeting) {
MakeGreeting(name);
}
static void Main(string[] args) {
GreetPeople(”Jimmy Zhang”, EnglishGreeting);
GreetPeople(”张子阳”, ChineseGreeting);
Console.ReadKey();
}
}
}
定义事件
namespace 最简单的自定义事件
{
/// <summary>
/// 事件发送类
/// </summary>
class Class1
{
public delegate void UserRequest(object sender,EventArgs e); //定义委托
public event UserRequest OnUserRequest; //定义一个委托类型的事件
public void run()
{
while(true)
{
if(Console.ReadLine()=="a")
{//事件监听
OnUserRequest(this,new EventArgs()); //产生事件
}
}
}
}
/// <summary>
/// 事件接收类
/// </summary>
class Class2
{
static void Main(string[] args)
{
Class1 c1 = new Class1();
c1.OnUserRequest += new Class1.UserRequest(c1_OnUserRequest); //委托实例化后绑定到事件
c1.run();
}
private static void c1_OnUserRequest(object sender, EventArgs e)
{//事件处理方法
Console.WriteLine("/t你触发了事件!");
}
}
}
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
person p = new person();
p.hello += new person.say(p_hello);
p.run();
Console.ReadKey();
}
static void p_hello()
{
Console.WriteLine("11");
}
}
class person {
public delegate void say();
public event say hello;
public void run() {
hello();
}
}
}
Form1
private void btnForm2_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();
form2.Show();
}
private void btnForm3_Click(object sender, EventArgs e)
{
Form3 form3 = new Form3();
form3.Show();
}
public delegate void ColorDelegate(string color);
public static ColorDelegate ColorChange = null;
private void cbColor_SelectedIndexChanged(object sender, EventArgs e)
{
if (ColorChange != null) {
ColorChange(this.cbColor.Text);
}
}
Form2
private void Form2_Load(object sender, EventArgs e)
{
Form1.ColorChange += delegate(string color)
{
switch (color)
{
case "red": this.BackColor = Color.Red; break;
case "black": this.BackColor = Color.Black; break;
case "blue": this.BackColor = Color.Blue; break;
};
};
}
Form3
private void Form3_Load(object sender, EventArgs e)
{
Form1.ColorChange += delegate(string color)
{
switch (color)
{
case "red": this.BackColor = Color.Red; break;
case "black": this.BackColor = Color.Black; break;
case "blue": this.BackColor = Color.Blue; break;
};
};
}