WhiteEngine-专注图形渲染与游戏引擎技术的网站

新浪微薄腾讯微薄

最新碎语:暂无碎语

您的位置:WhiteEngine-专注图形渲染与游戏引擎技术的网站 >C#与Lua> C#闭包,委托,匿名方法,lambda表达式的简单运用

C#闭包,委托,匿名方法,lambda表达式的简单运用

using UnityEngine; using UnityEngine;
using System.Collections;
using System;

public class NewBehaviourScript : MonoBehaviour {

    public delegate void deleMethod(int a, int b);

    public event deleMethod deleEvent;

    deleMethod v;

    void Start () {
        #region 闭包,闭包是指可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。
        //声明时不加任何的限制符的变量,默认就是自由变量,如int i;i就是自由变量,其实是省略了一个auto,加上auto的变量就是自由变量.
        //一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。闭包就是能够读取其他函数内部变量的函数
        Action A = CreateFunction();
        A();
        #endregion

        #region 普通委托
        v += fun;
        v(3, 6);
        #endregion

        #region 事件, 事件是对委托的限定 事件模式要求所有的事件处理程序的返回类型都为void event就是delegate的一种应用。加上event关键字的delegate能做的事,所谓纯的delegate也完全能做到。 
        //不想在声明delegate的类之外调用delegate,还有,除了声明delegate的类,其它类只能订阅(Subscribe,即+=)或取消订阅(Unsubscribe,即-=)时就给delegate加个event关键字。 
        deleEvent += fun;
        deleEvent(2, 3);
        #endregion

        #region 匿名函数(匿名委托)
        v += delegate(int a, int b) {
            Debug.LogError("B");
        };
        v += delegate(int a, int b) {
            Debug.LogError("A");
        };
        v(2,3);
        #endregion

        #region lambda表达式, 对匿名委托的简写
        v += (a,b) =>
        {
            Debug.LogError("C");
        };            
        v(5,10);
        #endregion
    }

    void fun(int a, int b)
    {
        Debug.LogError("fun");
    }

    #region 闭包
    private Action CreateFunction()
    {
        string str = "I am Andy";
        #region 这里产生了一个闭包
        return () =>
        {
            Debug.Log(str);
        };
        #endregion
    }
    #endregion
}




















































---

转载请注明本文标题和链接:《C#闭包,委托,匿名方法,lambda表达式的简单运用

发表评论

路人甲 表情
看不清楚?点图切换 Ctrl+Enter快速提交