1.委托介绍
委托(delegate)类似于c++中的指针,是存有对某个方法的引用的引用类型变量。使用委托都是先定义一个方法,然后把方法给委托的实例。接口是类的抽象,类是对象模板, 委托是方法的抽,。接口可以实现类的多态,委托可以实现方法的多态。当我们想调用某个具体方法时,不用直接调用这个方法,而是调用这个委托。我们需要在方法和委托中建立联系。委托声明决定了可由该委托引用的方法。委托可指向一个与其具有相同标签的方法。
2.委托的使用
实现一个delegate是很简单的,通过以下3个步骤即可实现一个delegate:
1. 声明一个delegate对象,它应当与你想要传递的方法具有相同的参数和返回值类型。
2. 创建delegate对象,并"将你想要传递的函数作为参数传入"。
3. 在要实现异步调用的地方,通过上一步创建的对象来调用方法。
3.委托demo
demo01
using System;
public class MyDelegateTest
{
// 步骤1,声明delegate对象
public delegate void MyDelegate(string name);
// 这是我们欲传递的方法,它与MyDelegate具有相同的参数和返回值类型
public static void MyDelegateFunc(string name)
{
Console.WriteLine("Hello, "+ name);
}
public static void Main()
{
// 步骤2,创建delegate对象
MyDelegate md = MyDelegateFunc;
// 步骤3,调用delegate
md("tom");
}
}
demo02
class Program
{
delegate void IntMethodInvoker(int x);
//定义委托,参数和返回值类型相同的方法都可以交给委托来调用
static void Main(string[] args)
{
IntMethodInvoker invoker = null;
//使用委托声明变量,委托可以引用其他方法,null表示目前没有引用任何方法
invoker = test;
//同一个类中的静态方法(static)可以直接调用,访问另外类中的方法要加上类名。
invoker(100);
//本身是一个变量却能直接当方法调用 ,把test方法把自身的调用委托给invoker。
}
private static void test(int x){
Console.WriteLine("我是test方法"+ x);
}
}
demo03
namespace 委托
{
public delegate void SayHelloDlg(string name);
//在类外声明一个无返回值,参数为sring的委托
class Program
{
public static event SayHelloDlg SayHelloEvent;
//声明一个SayHelloDlg类型的事件
static void Main(string[] args)
{
SayHelloDlg dlg = SayHello;
//实例化委托并引用SayHello方法
dlg += SayHello;
dlg("xiaoyang");
//委托的解释:将方法以变量的形式传递,并且以方法的形式执行。
SayHelloEvent += Program_SayHelloEvent;
//注册事件,这个事件会通知到Program_SayHelloEvent方法。
if (SayHelloEvent !=null)
{
SayHelloEvent("xiaoyang");
Console.ReadKey();
}
}
private static void Program_SayHelloEvent(string name)
{
Console.WriteLine(name+"我是事件");
}
public static void SayHello(string name) {
Console.WriteLine(name+"你好");
}
public static void SayGoodby(string name) {
Console.WriteLine(name+"再见");
}
}