c#一周学习

委托与事件

委托

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);//像这样.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值