從多個按鈕訂閱相同方法(?)來看匿名方法

多個按鈕綁定一個回調函數時……

等等,回調?

回調函數,或簡稱回調( Callback 即 call then back 被主函數調用運算後會返回主函數 ),是指通過函數參數傳遞到其它代碼的,某一塊可執行代碼的引用。這一設計允許了底層代碼調用在高層定義的子程序。

事件處理函數。

有這樣一個需要,在腳本中對多個按鍵綁定處理方法,但是這些按鈕的功能是很類似的,區別只在於一一對應的關係不同,分別操控不同的對象做相同的動作。因此在處理函數中只需要區分按下了哪一個按鈕,並找到相對應的對象就可以了。但在綁定處理函數時,往往是不能直接傳遞參數的,因此想到了,可以通過匿名函數,在作用域內,將局部變量用在匿名函數中去。看一下代碼:

使用 delegate 來完成:

public List<Button> btnList;
public override void Start()
{
    base.Start();
}

public bool foo()
{
    for (int i = 0; i < 4; i++)
    {
        int temp = i;
        btnList[temp].onClick.AddListener(
            delegate
            {
                BtnClicked(temp);
            }
        );

    }
}

public void BtnClicked(int index)
{
    ...
}

這裏的 temp 是不能夠省略的,如果直接使用 i,會在後面的事件處理函數中越界,我猜測是與 for 會清理有關係吧?(等等等等我問問問問試試試試一下)

正常有 c# 經驗的人應該都認得出這是個匿名函數吧,我也隱約覺得這是個匿名函數,可能是特殊的用法?其實在我的意識裏,早就潛移默化的錯誤的把匿名函數與 lambda 表達式等看了價在一起了,這是錯誤的錯誤的錯誤的。

lambda 表達式只是通常用匿名方法來解釋比較通俗,而匿名方法實際上並不是傳統意義上的方法或屬於某個類的方法,它純粹是爲了用作委託的目的才創建的:

delegate (parameters) {
    // Anonymous method code
}

這纔是匿名方法的最常見的用法呀!@

而本例中,利用了匿名函數最顯著的一個優勢,對於包含匿名方法的代碼塊來說,匿名方法是局部的,因此匿名方法是可以訪問到這個代碼塊中的局部變量的,而這個被匿名函數使用的局部變量也就成爲了外部變量(Outer Variable)(在超出作用域時是不會刪除的,匿名方法銷燬時,相關外部變量纔會刪除,前後有延遲,比我們期望的會晚一些)。

匿名方法是提供的匿名方法,可以用 lambda 表達式代替(待展開)。

關於參數,當 lambda 表達式沒有參數時需要用一個括號代替(保留括號),而 delegate 的方法可以完全將其省略。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章