事件与代理是比较难理解的部分,本人从中学习中写出的比较好理解的例子,C#中的delegate和C++中的函数指针基本是一回事,C#正是以delegate的形式实现了函数指针。不同的地方在于C#中delegate是类型安全的。
例一:
namespace DelegateTest
{
public delegate void MyDelegate();
class Test
{
static void Main(string[] args)
{
ChangedEvent chanevent = new ChangedEvent();
EventListener eventlis = new EventListener(chanevent);
chanevent.OnChanged();
Console.Read();
}
}
//定义一个包含事件成员的类,当发生变化时,就会触发事件
public class ChangedEvent
{
public event MyDelegate Changed;
public void OnChanged()
{
if (Changed != null)
Console.WriteLine("触发事件:");
Changed();
}
}
//创建包含处理方法的类
class EventListener
{
//用以保存从构造涵数的参数传递来的对象,主要是为了以后解除事件绑定
// private ChangedEvent CE;
public EventListener(ChangedEvent ce)
{
// CE = ce;
ce.Changed += new MyDelegate(DispMethod);
}
private void DispMethod()
{
Console.WriteLine("This is called when the event fires.");
}
}
}
例二:
namespace Delegate2
{
public delegate void MyDelegate();
class Test
{
static void Main(string[] args)
{
ChangedEvent chanevent = new ChangedEvent();
A a=new A();
chanevent.Changed += new MyDelegate(a.DispMethod);
chanevent.OnChanged();
Console.Read();
}
}
class A
{
public void DispMethod()
{
Console.WriteLine("This is called when the event fires.");
}
}
//定义一个包含事件成员的类,当发生变化时,就会触发事件
public class ChangedEvent
{
//public delegate void MyDelegate();
public event MyDelegate Changed;
public void OnChanged()
{
if (Changed != null)
{
Console.WriteLine("触发事件:");
Changed();
}
}
例三:有参数形的Delegate
namespace ConsoleApplication1
{
//定义委托
public delegate bool CompareInt(int a, int b);
public class MyCompare
{
public static bool ShowResult(int x , int y)
{
bool index = x > y ? true : false;
return index;
}
}
class Program
{
static void Main(string[] args)
{
CompareInt myDelegate = new CompareInt(MyCompare.ShowResult);
int a = 20;
int b = 15;
bool whoBigger = myDelegate(a, b);
Console.WriteLine(" a > b ?: " + whoBigger );
Console.Read();
}
}
}