c#委托与事件

委托:委托是类似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");
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

玉玊则不达

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

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

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

打赏作者

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

抵扣说明:

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

余额充值