委托Delegate
C#中的Delegate对应于C中的指针,但是又有所不同C中的指针既可以指向方法,又可以指向变量,并且可以进行类型转换,
C中的指针实际上就是内存地址变量,他是可以直接操作内存的,通过内存
地址直接访问变量,直接调用方法。
而C#中的Delegate是强类型的,也就是说在声明委托时就已经指定
了该变量只能指向具有特定参数,以及返回值的方法。
使用delegate就可以直接建立任何名称的委托类型,当进行系统编译
时,系统就会自动生成此类型。您可以使用delegate void MyDelegate()
方式建立一个委托类,并使用ILDASM.exe观察其成员。由ILDASM.exe
中可以看到,它继承了System.MulticastDelegate类,并自动生成BeginInvoke、EndInvoke、Invoke 等三个常用方法。
Invoke 方法是用于同步调用委托对象的对应方法,而BeginInvoke、EndInvoke是用于以异步方式调用对应方法的。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Skill
{
public void Skill1()
{
Console.WriteLine("Skill:技能1动画");
}
public void Skill2()
{
Console.WriteLine("Skill:技能2动画");
}
public void Skill3()
{
Console.WriteLine("Skill:技能3动画");
}
public void Skill4()
{
Console.WriteLine("Skill:技能4动画");
}
public void Skill5()
{
Console.WriteLine("Skill:技能5动画");
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
delegate void AutoSkillPlayer();
class Program
{
static void Main(string[] args)
{
AutoSkillPlayer akp = new AutoSkillPlayer(Skill1);
akp += Skill3;
akp += Skill4;
Skill sk = new Skill();
akp += sk.Skill4;
akp -= Skill1;
akp.Invoke();
}
public static void Skill1()
{
Console.WriteLine("技能1动画");
}
public static void Skill2()
{
Console.WriteLine("技能2动画");
}
public static void Skill3()
{
Console.WriteLine("技能3动画");
}
public static void Skill4()
{
Console.WriteLine("技能4动画");
}
public static void Skill5()
{
Console.WriteLine("技能5动画");
}
}
}