委托:委托是类似c/c++中的指针,在c#中应用最广泛的场景:控件事件的绑定,事件的类型是一个委托,事件有滞后性,肯定有一个明确的执行时机,并不是绑定事件后就能执行.
public delegate void printString(string s);
声明一个委托: public 委托访问修饰符,,表示这个委托在哪些地方可以使用.
delegate 关键字是专门定义委托的.
void(委托的方法)返回值,委托不直接干活,委托再拿某些方法使用,当委托找到某个方法时,方法必须满足委托约定的形参类型,形参个数,返回值类型
printString 委托的名字,建议使用小驼峰
(string s)(委托的方法)的形参
委托是存在对某个方法的引用类型变量(委托就是某个方法的地址变量),引用可以在运行时被改变,
委托不能直接调用.实例化一个委托让委托对应的方法的应用.
printString ps1 =new printString();
类中定义的委托不能通过类的实例来调用,所以尽量放在命名空间上方定义;类中定义的委托只能通过类来引用.
多播委托:委托对象可以使用"+"运算符进行合并,一个合并的委托调用它所合并的两个委托.只有相同类型的委托可以被合并."-"用于委托来从合并的委托中移除组件委托.
public delegate void moredelegate();
moredelegate md = new moredelegate();
moredelegate.numberchange mc1 = new moredelegate.numberchange(add);
moredelegate.numberchange mc2 = new moredelegate.numberchange(sub);
md = mc1;
md += mc2;
md -= mc1;
//相当于 md = mc1+ mc2 - mc1;
事件:事件是指用户的操作,如点击,双击等,或者是一些信息,如:通知.事件的发生时,需要执行一些业务逻辑(方法).事件应用时:事件声明,事件声明时,把事件类型设置为委托,调用(触发)事件.会使用设计模式:发布-订阅模式 .发布相当于报社,订阅相当于客户,客户订阅时,报社还可能没有生产.
事件的定义:
public event moredelegate calc;
触发事件:在main方法触发事件,将来在winform桌面应用程序,通过控件去触发事件.触发事件前提需要发布类(实例生产者)与订阅类(实例消费者),给事件初始化(生产者把生产的产品卖给消费者的过程).
namespace 事件
{
// 发布类: 发布器(publisher) 是一个包含事件和委托定义的对象。其实是“生产者”
public class Publish
{
private int num = 0; // 字段,用来保存Num的值
// A.委托,没有方法体
public delegate void NumHandler();
// B.事件声明,没有进行初始化
public event NumHandler NumChange;
public event NumHandler Change100;
public event NumHandler Change200;
// 到达某种时机执行NumChange事件。OnNumChanged====>button1_click
public void OnNumChanged()
{
// 事件的本质就是一个方法,它特殊在方法的类型是一个委托。
if (NumChange != null) // 事件必须初始化后,才能调用。
{
NumChange();
}
else
{
Console.WriteLine("事件必须经过初始化,再来调用或触发");
}
}
public int Num
{
get { return num; }
set
{
num = value; // 把num更改了
if (num == 100)
{
if (Change100 != null)
{
Change100(); // 触发事件
}
}
else if (num == 200)
{
if (Change200 != null)
{
Change200(); // 触发事件
}
}
else
{
OnNumChanged(); // 触发事件
}
}
}
}
}
发布类:发布器(publisher)是一个包含事件与委托定义的对象.其实是"生产者".
订阅类:是真正干活的人
namespace 事件
{
// 订阅类,其实是“消费者”
public class Subscribe
{
// “真正干活的人”,委托NumHandler将来要找的“真正干活的人”
public void Print()
{
Console.WriteLine("事件被调用或触发");
}
public void Print1()
{
Console.WriteLine("num更改成100");
}
public void Print2()
{
Console.WriteLine("num更改成200");
}
}
}