查看: 1770|回复: 2
打印 上一主题 下一主题

[其他] C#中使用匿名函数的优点

[复制链接]
may    

8830

主题

81

听众

7万

积分

首席设计师

Rank: 8Rank: 8

纳金币
52352
精华
343

最佳新人 热心会员 灌水之王 活跃会员 突出贡献 荣誉管理 论坛元老

跳转到指定楼层
楼主
发表于 2016-3-25 00:12:16 |只看该作者 |倒序浏览

在学习C#的时候,避免不了会接触到委托,事件,匿名函数之类的东西。一般情况下我们会这样写(UGUI为例)
  1. using unityEngine;
  2. using System.Collections;
  3. using UnityEngine.UI;
  4. using UnityEngine.EventSystems;
  5. using UnityEngine.Events;


  6. public class Tsttt : MonoBehaviour {
  7.     public Button btOK;
  8.     public Button btCancel;
  9.         
  10.         void Start () {
  11.         btOK.onClick.AddListener(this.onClick_BtOK);
  12.         btCancel.onClick.AddListener(this.onClick_BtCancel);
  13.         }

  14.     private void onClick_BtOK()
  15.     {
  16.         Debug.Log("Clicked OK");
  17.     }

  18.     private void onClick_BtCancel()
  19.     {
  20.         Debug.Log("Clicked Cancel");
  21.     }

  22.         void Update () {
  23.         
  24.         }
  25. }
复制代码
一个按钮的事件对应一个方法,很清晰明白。有点像WinForm里面的控件的事件函数,两个是很像。
但是有时候我们有批量操作按钮事件的需求,这种方式就不太适用了。我们可以使用匿名函数,实现
这个功能。
  1. using UnityEngine;
  2. using System.Collections;
  3. using UnityEngine.UI;
  4. using UnityEngine.EventSystems;
  5. using UnityEngine.Events;


  6. public class Tsttt : MonoBehaviour {
  7.     public struct Weapon
  8.     {
  9.         public string name;
  10.         public int damage;
  11.     }

  12.     public Weapon[] weaponInfos;
  13.     public Button[] btWeapons;

  14.         
  15.         void Start () {
  16.         for (int i = 0; i < btWeapons.Length; i++)
  17.         {
  18.             btWeapons[i].onClick.AddListener(() =>
  19.                 {
  20.                     this.OnClickBTWeapon(weaponInfos[i]);   
  21.                 });
  22.         }
  23.         }

  24.     /// <summary>
  25.     /// 点击武器按钮后响应
  26.     /// </summary>
  27.     /// <param name="go">传入需要的参数</param>
  28.     void OnClickBTWeapon(Weapon wp)
  29.     {
  30.         if (wp.name.ToLower().IndexOf("gun") >= 0)
  31.         {
  32.             //ShowDetailInfo
  33.         }
  34.     }

  35.         void Update () {
  36.         
  37.         }
  38. }
复制代码
可以看出来,在方法内使用匿名委托是很方便传参的。仔细对比一下上下的两种写法,多用用就能体会到其中的好处了。不过
在游戏里面也有不适用的地方,方便不方便也得区别对待,视情况而定。
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

3

主题

6

听众

570

积分

初级设计师

Rank: 3Rank: 3

纳金币
8
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2016-3-25 08:47:20 |只看该作者
这个方法你测试过吗?Lambda表达式里面的"i"能传递进去吗 ?

for (int i = 0; i < btWeapons.Length; i++)
        {
            weaponInfos w = weaponInfos[i];
            btWeapons[i].onClick.AddListener(() =>
                {
                    this.OnClickBTWeapon(w);   
                });
        }

是不是应该这样呢 ?
回复

使用道具 举报

1

主题

0

听众

1026

积分

助理设计师

Rank: 4

纳金币
49
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

板凳
发表于 2016-3-28 14:23:42 |只看该作者
qqbear_008 发表于 2016-3-25 08:47
这个方法你测试过吗?Lambda表达式里面的"i"能传递进去吗 ?

for (int i = 0; i < btWeapons.Length; i++)

确实应该这样,怀疑楼主没试过
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2025-8-2 22:11 , Processed in 0.064131 second(s), 28 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部