重读C#高级编程之委托and事件
曾经有过一次面试,要写:"猫叫,老鼠跑,主人醒"的程序,只记得要考察委托和事件,却没能写出来。
用委托和事件来处理当然很方便,但是现在象这样的问题,都会用到设计模式(观察者模式)来处理。自然是从灵活度上来考虑。因为不懂设计模式,暂时就简单的复习一下Delegate and Event吧~
Delegate实际上一个class,所以可以在定义class的任何地方定义delegate;说其类型安全,自然跟其定义方式有关:定义了代理方法体的详细细节(返回类型,参数列表),这样在使用的时候就能在编译阶段发现error. 我们使用代理,是因为它默认有一个参数:方法体名称,也就是可以通过Delegate来把方法当作参数传递。
Event自不必多说,但有一点必须注意:所有的事件是通过代理来激活的。这也就是为什么Delegate和Event结合这么紧密的原因.实际上查看控件已经定义好的Delegate和Event,我们也可以看出其作用和用法:如,Button 的Click事件,查看相关定义,metadata,可以看到:
Demo:猫叫,老鼠跑,主人醒
用委托和事件来处理当然很方便,但是现在象这样的问题,都会用到设计模式(观察者模式)来处理。自然是从灵活度上来考虑。因为不懂设计模式,暂时就简单的复习一下Delegate and Event吧~
Delegate实际上一个class,所以可以在定义class的任何地方定义delegate;说其类型安全,自然跟其定义方式有关:定义了代理方法体的详细细节(返回类型,参数列表),这样在使用的时候就能在编译阶段发现error. 我们使用代理,是因为它默认有一个参数:方法体名称,也就是可以通过Delegate来把方法当作参数传递。
Event自不必多说,但有一点必须注意:所有的事件是通过代理来激活的。这也就是为什么Delegate和Event结合这么紧密的原因.实际上查看控件已经定义好的Delegate和Event,我们也可以看出其作用和用法:如,Button 的Click事件,查看相关定义,metadata,可以看到:
this.button1.Click += new System.EventHandler(this.button1_Click);
public delegate void EventHandler(object sender, EventArgs e);
public event EventHandler Click;
很明显:首先定义EventHandler delegate,而后定义委托事件Click, then,在click事件触发的时候执行事件处理程序:button1_click;Demo:猫叫,老鼠跑,主人醒
using System;
using System.Collections.Generic;
using System.Text;
namespace ConstructorDemo
{
class Cat
{
public delegate void CryEventHandler(object o,EventArgs e); //声明Delegate
public event CryEventHandler Cry; //定义Event
private string m_name;
public Cat(string name)
{
m_name = name;
}
public void OnCry()
{
if (Cry != null)
{
Cry(this,EventArgs.Empty); //触发事件
}
}
}
public class Master
{
private string m_name;
public Master(string name)
{
m_name = name;
}
public void Response(object o, EventArgs e)
{
Console.WriteLine(m_name+"wake up");
}
}
public class Mouse
{
private string m_name;
public Mouse(string name)
{
m_name = name;
}
public void Response(object o, EventArgs e)
{
Console.WriteLine(m_name+"flee away");
}
}
}
namespace PInvokeDemo
{
class Program
{
static void Main(string[] args)
{
ConstructorDemo.Cat cat = new ConstructorDemo.Cat("cat1");
ConstructorDemo.Master ma = new ConstructorDemo.Master("ivan");
ConstructorDemo.Mouse ms = new ConstructorDemo.Mouse("jerry");
cat.Cry+=new ConstructorDemo.Cat.CryEventHandler(ms.Response); //为事件添加事件处理程序
cat.Cry +=new ConstructorDemo.Cat.CryEventHandler(ma.Response);
cat.OnCry(); //猫叫
}
}
}
Delegate的应用肯定不止这些,只是暂时还真不清楚具体在什么地方应用。等有机会再详细总结.
using System.Collections.Generic;
using System.Text;
namespace ConstructorDemo
{
class Cat
{
public delegate void CryEventHandler(object o,EventArgs e); //声明Delegate
public event CryEventHandler Cry; //定义Event
private string m_name;
public Cat(string name)
{
m_name = name;
}
public void OnCry()
{
if (Cry != null)
{
Cry(this,EventArgs.Empty); //触发事件
}
}
}
public class Master
{
private string m_name;
public Master(string name)
{
m_name = name;
}
public void Response(object o, EventArgs e)
{
Console.WriteLine(m_name+"wake up");
}
}
public class Mouse
{
private string m_name;
public Mouse(string name)
{
m_name = name;
}
public void Response(object o, EventArgs e)
{
Console.WriteLine(m_name+"flee away");
}
}
}
namespace PInvokeDemo
{
class Program
{
static void Main(string[] args)
{
ConstructorDemo.Cat cat = new ConstructorDemo.Cat("cat1");
ConstructorDemo.Master ma = new ConstructorDemo.Master("ivan");
ConstructorDemo.Mouse ms = new ConstructorDemo.Mouse("jerry");
cat.Cry+=new ConstructorDemo.Cat.CryEventHandler(ms.Response); //为事件添加事件处理程序
cat.Cry +=new ConstructorDemo.Cat.CryEventHandler(ma.Response);
cat.OnCry(); //猫叫
}
}
}