C#中的委托和事件

本文深入探讨了C#中的委托与事件机制,详细解释了委托的定义、使用及特性,以及事件的定义、注册与触发过程。通过具体代码示例,展示了如何在实际编程中灵活运用委托和事件来提高代码的复用性和可维护性。

C#中的委托和事件

1.委托

委托的声明原型是 
delegate <函数返回类型> <委托名> (<函数参数>)
例如:public delegate void Calculator(int i, int j);
这样就定义了一个委托,但是委托在.net内相当于声明了一个类,类如果不实例化为对象,很多功能是没有办法使用的,委托也是如此.

下面,直接来定义一个委托,并且来使用委托。

namespace _delegate
{
    public delegate void Calculator(int i, int j);//定义委托Compute,两个参数i和j;方法签名和加减法一样。无非是多加了一个delegate关键字。
    public class DelegateCal
    {
        private static void Add(int i, int j)//声明加法
        {
            Console.WriteLine("{0}", i + j);
        }
        private static void Sub(int i, int j)//声明减法
        {
            Console.WriteLine("{0}", i - j);
        }
        private static void Calculator(int i, int j, Calculator Cal)//Calculator这个方法有三个参数,第三个Compute是之前定义的委托类型。
        {
            Cal(i, j);  //委托类型Compute定义的一个Cal变量。在给Cal赋值的时候动态地决定使用哪个方法
        }
        //委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。
        /*static void Main(string[] args)
        {
            Calculator(2, 5, Add);
            Calculator(5, 2, Sub);
            Console.ReadLine();
        }*/
        //从此可以看出Compute和int都是数据类型,那么是不是可以定义两个变量,把方法赋给变量。  
        static void Main(string[] args)
        {
            //将方法绑定到委托
            /*Compute delegate1, delegate2;
            delegate1 = Add;
            delegate2 = Sub;
            Calculator(1,2, delegate1);//3
            Calculator(7,4, delegate2);//3
            Console.ReadLine();
           */
            //其实,委托还有一个特性不同于int或其他数据类型,它可以将多个方法绑定到同一个委托上。如下:
            /*Compute delegate1;
            delegate1 = Add;
            delegate1 += Sub;
            Calculator(5, 1, delegate1);
            Console.ReadLine();  //先输出加法为6,后输出减法为4;
             */
            //其实,我们可以不用Calculator方法,通过委托来直接调用Add方法或者Sub方法。如下:
            Calculator delegate1;
            delegate1 = Add;
            delegate1 += Sub;
            delegate1(9, 2);
            Console.ReadLine();//和为11、差为7
        }
    }
}

2.事件

了解了委托之后,咱们来讲一下事件。
C#中事件的定义和委托的声明其实是非常的相似:
                   event <委托类型> 事件名
例如: public event Computer OnComputer;//定义事件,将其与代理绑定
声明了事件之后就可以实例化这个事件,注册函数到事件中。
下面咱用一个例子来说明:

namespace _delegate
{
    public delegate void Computer(); //首先声明一个委托。
    public class EventCal
    {
        public event Computer OnComputer;//定义事件,将其与代理绑定
        public virtual void FireEvent()//触发事件的方法
        {
            if (OnComputer != null)
            {
                OnComputer();  //触发事件
            }
        }
    }
    public class Compere  //主持人
    {
        public void EventHandler()//事件处理函数
        {
            int a = 1;
            int b = 1;
            int c = a + b;
            Console.WriteLine("a+b={0}",c);
        }
        public static void Main()
        {
            EventCal ec = new EventCal();
            Compere c = new Compere();
            ec.OnComputer += new Computer(c.EventHandler);//注册
            ec.FireEvent();
            Console.Read();
        }
    }
}

EventCal类相当于一个时间发布者,它定义了事件的相关信息,包括定义了一个事件用于计算(OnComputer),以及一个触发事件的函数(FireEvent())

Compere类则相当于一个事件订阅者,或者说叫做主持人吧。它定义了一个事件处理函数(EventHandle()),并用+=将其与事件联系起来。从而使事件触发的时候能够调用我这个方法,其实就是计算一下a+b的值。
注意:事件处理函数的方法签名要与代理的方法签名相同,这是非常重要的一点

namespace _delegate
{
    public delegate void Computer(object sender, MyEventArgs e);//sender 产生事件的对象,e 事件的参数
    public class EventCal
    {
        public event Computer OnComputer;//定义事件,将其与代理绑定
        public virtual void FireEvent(MyEventArgs e)//触发事件的方法
        {
            if (OnComputer != null)
            {
                OnComputer(this,e);  //触发事件
            }
        }
    }
    public class MyEventArgs : EventArgs//定义事件参数类
    {
        public readonly int _a,_b;
        public MyEventArgs(int a,int b)//这是一个构造函数,参数列表为int a,int b
        {
            this._a = a;
            this._b = b;
        }
    }
    public class Compere  //主持人
    {
        public void EventHandler(object sender,MyEventArgs e)//事件处理函数
        {
            Console.WriteLine("a+b={0}",e._a+e._b);
        }
        public static void Main()
        {
            EventCal ec = new EventCal();
            Compere c = new Compere();
            MyEventArgs e = new MyEventArgs(1, 1); //构造函数传参
            ec.OnComputer += new Computer(c.EventHandler);//注册
            ec.FireEvent(e);
            Console.Read();
        }
    }
}

这个是有参数的事件。

posted @ 2016-04-04 18:17 土伦 阅读( ...) 评论( ...) 编辑 收藏
独立储能的现货电能量与调频辅助服务市场出清协调机制(Matlab代码实现)内容概要:本文围绕“独立储能的现货电能量与调频辅助服务市场出清协调机制”展开,提出了一种基于Matlab代码实现的优化模型,旨在协调独立储能系统在电力现货市场与调频辅助服务市场中的联合出清问题。文中结合鲁棒优化、大M法C&CG算法处理不确定性因素,构建了多市场耦合的双层或两阶段优化框架,实现了储能资源在能量市场辅助服务市场间的最优分配。研究涵盖了市场出清机制设计、储能运行策略建模、不确定性建模及求解算法实现,并通过Matlab仿真验证了所提方法的有效性经济性。; 适合人群:具备一定电力系统基础知识Matlab编程能力的研究生、科研人员及从事电力市场、储能调度相关工作的工程技术人员。; 使用场景及目标:①用于研究独立储能在多电力市场环境下的协同优化运行机制;②支撑电力市场机制设计、储能参与市场的竞价策略分析及政策仿真;③为学术论文复现、课题研究技术开发提供可运行的代码参考。; 阅读建议:建议读者结合文档中提供的Matlab代码与算法原理同步学习,重点关注模型构建逻辑、不确定性处理方式及C&CG算法的具体实现步骤,宜在掌握基础优化理论的前提下进行深入研读与仿真调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值