委托与事件及匿名函数和Lambda表达式简单介绍

namespace WeiTuoAndShiJian
{
    class Test//用于测试
    {
        public Action a1;

        public void Do(int a,Action fun)
        {
            Console.WriteLine(a);
            fun();
        }

        public Action GetFun()
        {
            return delegate () { Console.WriteLine("作为返回值"); };

        }
    }
    class Program
    {
        
        static void Main(string[] args)
        {
            

***region 委托与事件***

            #region 本质
            //委托本质是一个类
            //事件本质是一个特殊变量
            #endregion

            #region 语法

            #region 委托语法
            //访问修饰符 delegate 返回值 委托名(参数表);
            //写在命名空间或者class中
            #endregion

            #region 事件语法
            //访问修饰符 event 委托名 事件名  
            //1.不能再类外部复制与调用,但可以在外部加减
            //2.只能存在于类和接口、结构体中
            #endregion

            #endregion

            #region 使用

            #region 委托
            //1. MyFun f1=new MyFun(函数名);
            //2. f1=函数名; f1+=函数名
            //3. f1.Invoke();   f1();  调用委托
            #endregion

            #region 事件
            //使用和委托一样
            //public event Action t;
            #endregion

            #endregion

            #region 系统提供的委托
            //需要引入using System

            #region Action()
            //无参无返回值
            #endregion

            #region Aciton<T>(T)
            //有参数,无返回值
            #endregion

            #region T Func<T>()
            //无参有返回值

            #endregion

            #region T Func<K,T>(K)
            //有参有返回值
            #endregion

            #endregion
            #endregion

            *

**region 匿名函数**

*

            #region 基本语法
            //delegate(参数){语句块};
            //函数中传递委托参数时使用
            //委托或者事件赋值时使用
            //不能脱离委托与事件
            #endregion

            #region 使用
            //1无参
            Action a1 = delegate () { Console.WriteLine("test"); };
            a1();

            //2有参
            Action<int, string> a2 = delegate (int a, string b) { Console.WriteLine("Test2"); };
            a2(1,"ss");

            //3有返回值
            Func<string> f1 = delegate () { return "s2d"; };
            Console.WriteLine(f1());

            //4作为函数的参数传递
            Test t = new Test();
            t.Do(1, delegate () { Console.WriteLine("作为参数"); });

            //5作为返回值
            t.GetFun()();
            #endregion

            #region 缺点
            //添加后不能移除,只能清空,一般用在一次性的地方
            #endregion

            #endregion

            

***region Lambda表达式***

            //使用上与匿名函数一模一样

            #region 语法
            //(参数)=>{语句块};
            #endregion

            #region 使用
            //可省略参数类型
            Action<int> a3 = (value) => { Console.WriteLine("Lambda测试"); };
            #endregion

            #region 闭包
            //内层函数可以引用包含在它外层的函数的变量
            //即使外层函数的执行已经终止
            //该变量提供的值为父函数范围内的最终值
            #endregion

            #endregion

        }
    }
}


你可能感兴趣的:(c#的学习记录,c#)