C#委托

using System;
using static System.Console;

//委托 降低耦合
//如果一个函数的参数是一个函数
//就可以定义一个委托

namespace ConsoleApp
{
    class Program
    {
        //委托
        //可以在类的内部、外部,名字空间 定义委托
        //相当于一个函数类型
        public delegate void WtiteAString(int i);

        public static void fun(int i)
        {
            WriteLine(i);
        }

        public static void fun1()
        { }

        static void Main(string[] args)
        {
            //复制会重新分配一个方法
            WtiteAString write = fun;
            write = new WtiteAString(fun);

            write(1);
            

            //Action<T>委托,返回类型为void
            Action<int> op1 = fun;
            op1(2);

            Action d = fun1;

            //Func<T>委托
            //单参,表示返回类型,多参前面表示方法的参数,最后一个表示返回类型
            Func<int, double> op2;

            //多播委托,使用+ += - -=
            //其调用的顺序并未正式定义,所以要避免写依赖顺序调用方法的代码
            op1 += fun;

            //如果委托调用的一个方法引发了异常,委托迭代就会停止,不再调用其他方法
            //为避免这种情况,应自己迭代方法列表
            Action d1 = fun1;
            d1 += fun1;
            Delegate[] delegates = d1.GetInvocationList();
            foreach (Action d2 in delegates)
            {
                try
                {
                    d2();
                }
                catch (Exception)
                {
                    WriteLine("Exception caught");
                }
            }

            //匿名方法 委托一个现写的函数
            //匿名方法不能使用跳转语句(break goto continue)跳到该匿名方法外部
            //不能访问外部ref、out参数,但可以使用其他的外部变量
            string mid = ", middle part,";
            Func<string, string> anonDel = delegate (string param)
            {
                param += mid;
                param += " and this was added to the string.";
                return param;
            };

            WriteLine(anonDel("start of string"));


            //lambda表达式
            Func<string, string> oneParam = 
                s2 => $"change uppercase {s2.ToUpper()}"; //s2为参数
            WriteLine(oneParam("test"));

            //多个参数
            Func<double, double, double> twoParams =
                (x, y) => x * y;
            WriteLine(twoParams(2, 3));
        }
    }
}

 

posted @ 2018-09-05 14:48  xslwm  阅读(121)  评论(0编辑  收藏  举报