Posted on 2008-04-10 21:16
火山工作室 阅读(69)
评论(0) 编辑 收藏 引用 网摘 所属分类:
高职IT教育
(1)委托的语法:从形式上看是方法,从理解上看要认为它是类。
public delegate 返回类型 委托名(参数);
示例:
public delegate void SimpleDelegate(string s); //定义一个委托,确定了函数的签名
class Test
{ static void F(string s) //C#定义的一个非常普通的方法
{
System.Console.WriteLine("Test.F {0}",s);
}
static void Main()
{
SimpleDelegate d = new SimpleDelegate(F); //将委托实例化,实参是一个方法的名字
d("Hello,This a delegate"); //用委托,本质上调用的是F这个方法.
}
}
|
(2)如何理解委托
l 委托 delegate是只有一个函数的特殊的类,并且这个函数是哪一个都不知道,在实例化时才将这个方法名输入进来。
l 委托对象的引用相当函数指针
l delegate 声明定义一种引用类型,该类型可用于将方法用特定的签名封装。委托实例封装静态方法或实例方法。委托大致类似于 C++ 中的函数指针;但是,委托是类型安全和可靠的。
l 委托使您得以将函数作为参数传递。传递的函数形参和委托声明的形参必须相同,即相同的方法签名。
(3)多播委托
l 委托类型实例化时,可以在new后面输入一个方法名。但也可以事后用“+”运算符来组合绑定其它的方法进来。组合的委托依次调用组成它的两个委托。
l 只可组合相同类型的委托,并且委托类型必须具有 void 返回值。
l “-”运算符可用来从组合的委托移除组件委托
示例:
delegate void SampleDelegate(string message); // 声明委托,定义所需要的签名
class MainClass
{
//在类中定义两个具有与委托相同参数列表的方法
static void SampleMethod1(string message)
{
Console.WriteLine("SampleMethod1\t" + message);
}
static void SampleMethod2(string message)
{
Console.WriteLine("SampleMethod2\t" + message);
}
static void Main(string[] args)
{
SampleDelegate d1 = SampleMethod1;
SampleDelegate d2 = SampleMethod2;
SampleDelegate d3 = d1 + d2;
d3("Test");
}
}
|
(4)事件
事件是对象发送的消息,以发信号通知操作的发生。操作可能是由用户交互(例如鼠标单击)引起的,也可能是由某些其他的程序逻辑触发的。引发(触发)事件的对象叫做事件发送方。捕获事件并对其作出响应的对象叫做事件接收方。
在事件通信中,事件发送方类不知道哪个对象或方法将接收到(处理)它引发的事件。所需要的是在源和接收方之间存在一个媒介(或类似指针的机制)。 .NET Framework 定义了一个特殊的类型(Delegate),该类型提供函数指针的功能。。
要定义、处理事件,必须按下列顺序完成:
1、以委托定义事件的方法签名,比如:
2、定义一个事件及事件触发的逻辑。
3、定义事件处理方法
4、并且将事件连接到事件处理方法;
5、事件源,触发事件。
基于 Windows 的应用程序和 Web 应用程序都是基于事件驱动的应用程序,即根据事件来执行代码。
(5)自定义事件示例
MyEventHandler.cs
public delegate void MyEventHandler(object o,MyEventArgs args);
|
MyEventArgs.cs
public class MyEventArgs
{
private string s;
public MyEventArgs(string s)
{
this.s = s;
}
public string Message
{
get
{
return s;
}
}
}
|
MyClass.cs
public class MyClass
{
public event MyEventHandler MyClick;//定义一个事件
public void OnEvent(int i) //事件发生
{
if(i=100)
MyClick(this,new MyEventArgs("打架事件"));
}
}
|
Display.cs
public class Display
{
public void Mybutton1_Click(object sender, MyEventArgs e)
{
Console.WriteLine("事件已经发生:"+e.Message);
}
}
|
Class1.cs
using System;
class Class1
{
static void Main(string[] args)
{
MyClass mytest = new MyClass();
Display myDisplay = new Display();
mytest.MyClick += new MyEventHandler(myDisplay.Mybutton1_Click);
mytest.OnEvent(100);
}
}
|
以上程序的类图如下: