委托与事件
委托
C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。
委托的语法:delegate <return type> <delegate-name> <parameter list>
委托的实例化
我们可以借用委托来引用一个具有与委托相同类型参数的方法
internal class Program
{
public delegate int del(int x, int y);
public static int Add(int x,int y)
{
int num = x + y;
return num;
}
public static int Mult(int x,int y)
{
int num = x * y;
return num;
}
static void Main(string[] args)
{
del del1 = new del(Add);
del del2 = new del(Mult);
Console.WriteLine(del1(5, 7));//输出12。
Console.WriteLine(del2(5, 7));//输出35。
Console.ReadLine();
}
}
委托的多播
委托对象可使用 “+” 运算符进行合并。一个合并委托调用它所合并的两个委托。只有相同类型的委托可被合并。“-” 运算符可用于从合并的委托中移除组件委托。
当我们使用合并委托时输出的往往只有最后加进去的函数
del del0 = null;
del del1 = new del(Add);
del del2 = new del(Mult);
del0 += del1;
del0 += del2;
Console.WriteLine(del0(5,7));//此时输出的值为35.
如果我们想使用合并委托中的所有函数可以使用foreach。
foreach (del dels in del0.GetInvocationList())
{
Console.Write(dels(5, 7)+" ");
}//输出12 35;
或使用for循环
del del0 = null;
del del1 = new del(Add);
del del2 = new del(Mult);
del del3 = new del(Add);
del0 += del1;
del0 += del2;
del0 += del3;
Delegate[] dels = del0.GetInvocationList();
for (int i = 0; i < dels.Length; i++)
{
del a = (del)dels[i];
Console.Write(a(5,7)+" ");
}//输出12 35 12;
事件
事件(Event) 基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些提示信息,如系统生成的通知。应用程序需要在事件发生时响应事件。
1.event修饰的委托只能在类内能被调用执行,类外不可调用执行
2.event修饰的委托类外不可被直接赋值,只能通过+ - 增减其中蕴含的方法。
class Player
{
public event EventHandler OnAttack = null;
public void DoAoE()
{
if(OnAttack != null)
{
OnAttack(this, EventArgs.Empty);
}
}
}
class Enemy
{
public void AttackMe(object sender, EventArgs e)
{
Console.WriteLine("我被攻击了");
}
}
internal class Program
{
static void Main(string[] args)
{
Player player = new Player();
Enemy e = new Enemy();
player.OnAttack += e.AttackMe;
player.DoAoE();//当使用event修饰OnAttack时OnAttack只能在+=,-=的左边。
//当去掉event时,可以直接调用OnAttack;
player.OnAttack(new object(),EventArgs.Empty);//像这样.