纳金网

标题: C#中使用匿名函数的优点 [打印本页]

作者: may    时间: 2016-3-25 00:12
标题: C#中使用匿名函数的优点

在学习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. }
复制代码
可以看出来,在方法内使用匿名委托是很方便传参的。仔细对比一下上下的两种写法,多用用就能体会到其中的好处了。不过
在游戏里面也有不适用的地方,方便不方便也得区别对待,视情况而定。
作者: qqbear_008    时间: 2016-3-25 08:47
这个方法你测试过吗?Lambda表达式里面的"i"能传递进去吗 ?

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

是不是应该这样呢 ?
作者: views63    时间: 2016-3-28 14:23
qqbear_008 发表于 2016-3-25 08:47
这个方法你测试过吗?Lambda表达式里面的"i"能传递进去吗 ?

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

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




欢迎光临 纳金网 (http://go.narkii.com/club/) Powered by Discuz! X2.5