代表(delegate):
它是C#语言里面的函数指针,代表可以指向某一个函数,在运行的时候调用这个函数的实现。下面来看看它的实现步骤:
-
声明一个delegate对象。
- 实现和delegate具有相同参数和返回值的函数实现(可以是静态和非静态的)。
- 产生一个delegate对象的时候,把你刚刚实现的函数作为参数传给他的构造函数。
请看下面例子:源码下载
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DelegateDemo
{
public delegate void MyDelegate(string mydelegate); //声明一个delegate对象
public class TestClass
{
//实现有相同参数和返回值的函数
public void HelloDelegate(string mydelegate)
{
Console.WriteLine(mydelegate);
}
//实现有相同参数和返回值的静态函数
public static void HelloStaticDelegate(string mystaticdelegate)
{
Console.WriteLine(mystaticdelegate);
}
}
class Program
{
static void Main(string[] args)
{
TestClass testClass = new TestClass();
MyDelegate mydelegate = new MyDelegate(testClass.HelloDelegate); //产生delegate对象
mydelegate("Hello delegate");
MyDelegate myStaticDelegate = new MyDelegate(TestClass.HelloStaticDelegate);
myStaticDelegate("Hello static delegate");
Console.ReadKey();
}
}
}
事件(event):
让我通过一个例子来模拟事件的整个过程:
- 创建一个MyButton类,它里面有一个Click 事件。
- 创建一个MyForm类,他里面有一个我们上面定义的MyButton类。
- 要求当我们用户单击MyButton类的时候MyForm类要对他进行处理,输出一条信息“我知道你被单击了”
请看下面例子:源码下载
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DelegateAndEventDemo
{
public delegate void ClickEventHandler(object sender, EventArgs e); //声明一个代理
public class MyButton
{
public event ClickEventHandler ClickEvent; //声明一个事件
public void Click()
{
if (ClickEvent != null)
{
Console.WriteLine("MyButton:我被单击了");
ClickEvent(this, null);
}
}
}
public class MyForm
{
public MyButton myButton = new MyButton();
public MyForm()
{
myButton.ClickEvent += new ClickEventHandler(OnClickEvent);
}
void OnClickEvent(object sender, EventArgs e)
{
Console.WriteLine("MyForm:我知道你被单击了");
}
}
class Program
{
static void Main(string[] args)
{
MyForm form = new MyForm();
form.myButton.Click();
Console.ReadKey();
}
}
}
Note:public delegate void ClickEventHandler(object sender, EventArgs e);这是事件委托标准的声明方法,其实在参数里面我们可以不传,也可以是其他类型的。但是最好还是使用上面的声明方法,你可以继承EventArgs,来包装你要传送的其他任何参数。