越来越喜欢面向对象里面的event
C#的教学已2个月有余,最有收获的便是委托和事件,这一C#的高级特性我总结了一个高效的授课思路,经过验证是卓有成效的。现在共享给大家测试一下,如果你对C#中的事件(event)还稍有陌生,不妨跟着我的思路,看是否你看过以后有所启发!
0.C#方法的复习,C#方法就是对象可以执行的动作,比如人可以吃饭,我们可以这样定义
public class Customer
{
public void Eat() { }
}
1.委托(delegate)的引入:一、从原理上来讲,委托是对方法的包装,这样我们可以很快速地记住委托的定义形式,即委托关键字+方法定义,按照这个方法,我们定义如下委托--吃完晚饭
delegate void FinishDinner(object food,decimal cost);
很多人在定义委托时总是拿不定格式,特别是刚入门的同学更是如此,其实只要你会方法的定义,再知道委托的关键字(delegate)就一切都搞定了,看上面的定义,前面是委托关键字delegate,后面是方法的描述void FinishDinner(object food,decimal cost);同时这也充分地说明了为什么委托是对方法的包装或者方法指针(C++中的叫法),很形象吧!二、前面我们从语法的角度上描述了委托,下面我们再从实际意义上解释,基于事件机制,我们总是希望在一件事情发生时同时触发另外的动作,这里的委托其实是受人之托,比如当我们希望结账的时候,我们可以用吃完晚饭这个动作来触发,只要把它委托到结账方法上面即可,详细代码在后面。
2.事件是一种委托类型,定义事件的时候使用event+委托,也即是说一个事件总是使用某种委托方式,代码如下:
public event FinishDinner OnFinishDinner;
同时我们需要定义触发该事件的方法:
public void Finish()
{
OnFinishDinner("Pizza", 100);
}
也即是我们花了100块吃了个Pizza,在Windows程序设计中,事件的触发总是由某种点击完成,比如Button的鼠标点击会触发其Click事件,在这里,那个鼠标的点击动作和我们这个方法Finish是异曲同工。
3.事件关联,事件的主要用处在于两个对象之间的通信,是面向对象中消息机制的主要载体。事件的使用一般是这样的:关联两个对象,假设这里有两个人A和B,我们一般将其中一个对象的某个字段或者属性设置为另外一个对象,假设A和B是两个类
class A
{}
class B
{
A a;
}
上面的代码对A和B进行了关联,然后就可以在B中对A的某个事件进行方法关联,这样,当A中的事件发生时,B中绑定的方法也会同时被执行,也就实现了对象之间的联动,也即通信,具体代码可以表述为:
class A
{
public event FinishDinner OnTest;
public void CallEvent()
{
OnTest(null,null);
}
}
class B
{
A a;
a.OnTest+=new FinishDinner(TestInvoke);
void TestInvoke(object food,decimal cost)
{}
}
至此,从委托声明直至事件的关联都已经说完了,当然这里面需要有很多的基础或者是开发经验,要不然理解起来很可能还是有些吃力,下面给出以个完整的事件代码,有兴趣的读者可以在自己的开发环境中试试,完整的代码如下:
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Customer c = new Customer();
Waiter w = new Waiter(c);
c.Finish();
}
}
public delegate void FinishDinner(object food, decimal cost);
//顾客
public class Customer
{
public event FinishDinner OnFinishDinner;
public void Finish()
{
OnFinishDinner("Pizza", 100);
}
}
//服务员
public class Waiter
{
Customer c;
public Waiter(Customer c)
{
this.c = c;//表示该服务员服务的是该顾客
this.c.OnFinishDinner += new FinishDinner(c_OnFinishDinner);
}
void c_OnFinishDinner(object food, decimal cost)
{
Console.WriteLine("hello,you have consume{0} and you need to pay{1}",food,cost);
}
}
}

浙公网安备 33010602011771号