委托匿名委托,0中的委托

 第2回写博客,经验不足,有无数地点考虑不到,还请我们海涵。

委托与无名氏委托,委托无名氏委托

当然是想写一篇《委托与lambda表明式的前生今生》,但仅委托部分已经写了成都百货上千内容,于是就此分开关于拉姆da表明是的剧情后续再写吧。

不晓得拉姆da表明式是什么人发明的,只记得首先次接触Lambda表明式是在运用VS二〇一〇的时候,那就先以为是微软申明的呢。

Lambda表明式从本身接触早先到以往变得更其流行,Java第88中学伊始扶助、kotlin更是对C#,F#做了大面积的抄袭(C#委托匿名委托,0中的委托。什么时候不也那样看待过Java嘛)。其实那都丰富表达了,Lambda表明式的机要。要搞清楚Lambda首先须要搞驾驭委托。

委托:

比近来后我们要开辟三个拍卖四个整数的次序(若是先管理相加操作)

public class Worker
        {
            /// <summary>
            /// 处理两个数
            /// </summary>
            /// <param name="a"></param>
            /// <param name="b"></param>
            /// <returns></returns>
            public int HandleTwoNumber(int a,int b)
            {
                return a + b;
            }
        }
static void Main(string[] args)
        {
            int a = int.Parse(Console.ReadLine());
            int b = int.Parse(Console.ReadLine());

            Worker worker = new Worker();
            int result = worker.HandleTwoNumber(a, b);
            Console.WriteLine(String.Format("Result:{0}", result));

            string p = Console.ReadLine();
}

若果壹段时间后,咱们必要它更改为减操作:

public class Worker
        {
            public int HandleTwoNumber(int a,int b)
            {
                return a - b;
            }
        }

虽说有a+b变为a-b的浮动很轻微,但持续此处只怕面对频仍改变(由减变为除………)。有浮动就应封装变化,此处大家能够将a与b的操作行为抽象出来,用什么抽象呢?委托

public class Worker
        {
            public delegate int TwoNumberHandleMethodDelegate(int x, int y);
            public int HandleTwoNumber(int a,int b)
            {
                return a + b;
            }
        }

public delegate int TwoNumberHandleMethodDelegate(int x, int y);此处用delegate标注,表明这是一个委托定义。如果去掉 delegate 再来观察该定义,你会发现这就是一个没有方法体的抽象方法。所以委托的含义即:与该抽象方法签名形式相同的方法的类型。委托就是一种你定义的新数据类型,它与int、class是一样的都是数据类型。int表示整数,只要是整数都可以赋值给 int型变量;TwoNumberHandleMethodDelegate则表示,接收两个int型参数并返回int型结果的这类方法,因此满足上述要求的方法都可赋值给TwoNumberHandleMethodDelegate类型的变量。

如此一来Worker代码可修改为:

public class Worker
        {
            public delegate int TwoNumberHandleMethodDelegate(int x, int y);
            public int HandleTwoNumber(int a, int b, TwoNumberHandleMethodDelegate handle)
            {
                return handle(a, b);
            }
        }

如此a、b的操作被卷入起来,全部的调换均交由调用者来管理。此处的含义:HandleTwoNumber管理a、b七个整数,具体怎么样管理由 handle
施行。此时您或者会问,那怎样来调用该措施吧?调用如下:

private static int Add(int a, int b)
        {
            return a + b;
        }

        private static int Sub(int a, int b)
        {
            return a - b;
        }

        static void Main(string[] args)
        {
            int a = int.Parse(Console.ReadLine());
            int b = int.Parse(Console.ReadLine());
            Worker.TwoNumberHandleMethodDelegate method = new Worker.TwoNumberHandleMethodDelegate(Add);
            Worker worker = new Worker();
            int result = worker.HandleTwoNumber(10, 10,method);
       //int result = worker.HandleTwoNumber(10, 10, Sub);//简化版

            Console.WriteLine(String.Format("Result:{0}", result));
 }

听新闻说地点的次第能够,Main代码块为worker的调用者,作为调用者来讲应该最知道本人想要让woker做的办事。因而作为被调用者的worker来说,它只须要接受调用者Main给的a\b参数及实行Main定制的算法method,然后依照算法施行并重返结果就可以。上边代码即使轻易,但里面包车型客车含义隽永,随着编制程序时间的加码信任你的明亮将越深厚。

委托变量在开始展览赋值时除了规范的主意,还足以拓展简化:

Worker.TwoNumberHandleMethodDelegate method = new Worker.TwoNumberHandleMethodDelegate(Add);
            Worker worker = new Worker();
            int result = worker.HandleTwoNumber(10, 10,method);
//可简化为
// int result = worker.HandleTwoNumber(10, 10,Add);

编译器将电动物检疫查Add是否适合 TwoNumberHandleMethodDelegate
的定义,假使符合允许直接将艺术名赋值给委托变量。

无名委托

通过上面的亲自过问代码,大家很轻巧察觉 TwoNumberHandleMethodDelegate method
变量被赋值为Add(Sub),因而在调用method(…)时一定于调用Add(…..)。那样一来即可以为

method与Add完全等效,既然等效那是还是不是能够直接将Add的定义内容赋值给method变量呢?答案是迟早的:

static void Main(string[] args)
        {

            Worker.TwoNumberHandleMethodDelegate method =private static int Add(int a, int b)
        {
            return a + b;
        };
}

但像上边这种生拉硬套是十一分的,你还要求做修改。修改内容是:因为后天的代码处于Main方法中,访问修饰符去掉,一样static也应去掉;同时编写翻译器知道您要给method赋值,那么要赋的那个值肯定满意再次来到类型为int的渴求,全部int在那儿就剩下了去掉;因为赋值之后method就等效于Add,未来调用只要经过method变量就可做到,全部Add方法名无需消除。如此代码变为如下格局:

static void Main(string[] args)
        {

            Worker.TwoNumberHandleMethodDelegate method =   (int a, int b)
        {
            return a + b;
        };
}

因此地点的修改内容简化了好些个,但method赋值的=右端是怎样东西呢?此时编写翻译器并无法正确识别那是1个办法,因为方法的概念供给满足包罗:访问修身符、重返类型、方法名、参数列表、方法体5部分剧情。固然您心里清楚这是个简化了的艺术,然而编写翻译器不懂你的心………,那无妨只要大家告诉编写翻译器,前边的是个简化方法就足以了。

static void Main(string[] args)
        {

            Worker.TwoNumberHandleMethodDelegate method =   delegate(int a, int b)
        {
            return a + b;
        };
}

正如您所愿意的那样,以往编写翻译器已经理解了=右边是您通过简化的章程;ok,以后能够不荒谬赋值并使用了。

通过上边包车型客车定义我们发掘,用delegate标注的简化方法未有2个像Add/Sub同样稳定的名字。由此我们称这种措施叫无名氏委托(小编习惯称佚名格局)。

你可能还注意到该无名氏委托定义完成后就赋值给Main代码快中的局部变量method,因而当不仅仅method的功用域后,该格局就再也尚未机会调用了。那引出了无名氏方式、无名委托、无名函数它们的最广大用法,即用来定义只需求采纳3遍的功能代码。

本来是想写1篇《委托与lambda表明式的前生今生》,但仅委托部分已经写了广大剧情,于是就此分开关于…

许5俗世接在问:哪一天该用委托,为何要用委托,委托有怎么着好处….

  由于.net 二.0引进了无名氏情势,所以创设委托的措施得以更简化了。

一. 委托的选拔场景?
  壹. 把措施当作参数字传送给其余格局时,需求动用委托。
2. 什么是信托?
     一. 信托是1种档期的顺序,属于引用类型,定义委托的首要字是 delegate
,在命名空间下以及类的里边都得以定义委托。
     二. 宣称委托的语法:
        a. [做客修饰符] delegate 重回值类型 委托类型名 ([参数])
     三. 3个简约的寄托行使:

看完下边包车型客车小说你将发聋振聩..(看不懂的第二手TDDTDS)

.net 二.0中的委托

有了无名方式,上1篇的例证可以简化为:

 1 namespace DelegateDemo
 2 {
 3     //声明委托
 4     public delegate void MyDel(string arg1, string arg2);
 5 
 6     class Program
 7     {
 8         static void Main(string[] args)
 9         {
10             //.net 2.0中的委托
11 
12             //创建委托,使用匿名方法
13             MyDel myDel = delegate(string arg1, string arg2)
14             {
15                 Console.WriteLine(string.Format("arg1:{0},arg2:{1}", arg1, arg2));
16             };
17 
18             //调用委托
19             myDel("aaa", "bbb");
20 
21             Console.ReadKey();
22         }
23     }
24 }

 

能够见见,不要再去单独定义类型和方法了,只须要利用内联的语法实现就足以了。

 class Program
    {
        //声明一个委托
        delegate void DoSomething();
        static void Main(string[] args)
        {
            //创建一个委托实例,并将符合委托签名的方法赋给它
            DoSomething onEvening = LearningEnglish;
            //调用需要使用到委托的方法,并将委托实例传给对应的参数
            DoSomethingBeforeSleep("Chris", onEvening);


            Console.ReadKey();
        }
        //定义一个符合委托类型DoSomething签名的方法
        static void LearningEnglish()
        {
            Console.WriteLine("背会单词吧。");
        }
        //需要用到委托的方法
        static void DoSomethingBeforeSleep(string name, DoSomething doSomething)
        {
            Console.WriteLine("睡前做点什么呢?");

            doSomething.Invoke(); //等价于 doSomething();

            Console.WriteLine($"{name}:我要睡觉了。");
        }
    }

概念纵然自个儿不欣赏讲太多

  四. 委托的有余显示格局:

咱俩直接先来YY
个情景:作者很喜爱打游戏,但命局倒霉每一次打游戏都会被首席营业官看到,朱老董不欣赏她的职员和工人在上班的时

 static void Main(string[] args)
        {
            #region 常规用法:

            //创建一个委托实例,并将符合委托签名的方法赋给它
            DoSomething onEvening = LearningEnglish;
            //调用需要使用到委托的方法,并将委托实例传给对应的参数
            DoSomethingBeforeSleep("Chris", onEvening);

            #endregion

            #region 使用匿名方法

            DoSomethingBeforeSleep("Chris",delegate { Console.WriteLine("背会单词吧。"); });

            #endregion

            #region 使用Lambda语句

            DoSomethingBeforeSleep("Chris", () => { Console.WriteLine("背会单词吧。"); } );

            #endregion

            #region 使用Lambda表达式

            DoSomethingBeforeSleep("Chris", () => Console.WriteLine("背会单词吧。"));

            #endregion
            Console.ReadKey();
        }

间打游戏,所以朱老董就跟高管说:以往职员和工人在打游戏,你就扣他20块钱.

 五. 通用委托(泛型委托):System.Action
、System.Func、System.Predicate(略)

这实在就是五个委托,朱老总委托主持1旦发觉职员和工人打游戏,就做一件事情.

  1.为了削减自定义委托项指标必备,.NET3.5(C#三.0)包罗了一组通用的委托

次第该怎么写吗?

    1.壹 Action :代表无参数且尚未再次来到值的点子。  

最少有一个类吧,老总与职工,经理有个法子扣钱,职员和工人有个法子玩游戏,那么开始动工了

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

            DoSomethingBeforeSleep("Chris", LearningEnglish);
            Console.ReadKey();
        }

        //定义一个符合委托类型 delegate void DoSomething() 签名的方法
        static void LearningEnglish()
        {
            Console.WriteLine("背会单词吧。");
        }

        //需要用到委托的方法
        static void DoSomethingBeforeSleep(string name, Action doSomething) //Action 等价于 delegate void DoSomething() 这个类型的一个委托。
        {
            Console.WriteLine("睡前做点什么呢?");

            doSomething.Invoke();

            Console.WriteLine($"{name}:我要睡觉了。");
        } 

 员工类:

    壹.2Action<>:代表包括呼吁参数且并未有重临值的办法,<>里定义参数的花色和个数。   

public class Employee
     {
         //职员和工人的薪给
         private int money;

 class Program
    {
        static void Main(string[] args)
        {
            //调用包含委托的方法
            DoSomethingBeforeSleep("Chris", Learnning);

            Console.ReadKey();
        }

        //定义一个符合委托类型 delegate void DoSomething(string parameterName) 签名的方法
        static void Learnning(string subjectName)
        {
            Console.WriteLine($"学会儿{subjectName}吧。");
        }

        //需要用到委托的方法
        static void DoSomethingBeforeSleep(string name, Action<string> doSomething) //Action 等价于 delegate void DoSomething(string parameterName) 这个类型的一个委托。
        {
            Console.WriteLine("睡前做点什么呢?");

            doSomething.Invoke("英语"); //调用这个委托的实例,并传递一个string类型的参数

            Console.WriteLine($"{name}:我要睡觉了。");
        }

         //该职员和工人的主办  
         private Manager Manager;

    一.叁 Func<>
:代表有再次来到值的方法,且<>中最终3个参数始终为回去值类型,从前的参数都为呼吁参数的连串。

         public Employee(Manager manager)
         {
             // 通过构造函数,开头化员工的掌管与报酬。
              Manager = manager; 

class Program
    {
        static void Main(string[] args)
        {
            int times = 0;
            do
            {
                DoSomething("Chris", GetNowHour);
                times++;
            } while (times<10);

        }

        public static int GetNowHour()
        {
            return new Random().Next(0, 12);
        }

        public static void DoSomething(string name ,Func<int> whatTime)  //Func<int> 等价于委托 delegate int DoSomething();
        {
            var hour = whatTime.Invoke();

            switch (hour)
            {
                case 5: Console.WriteLine($"{name}该起床");
                    break;
                case 7: Console.WriteLine($"{name}出门");
                    break;
                case 12:
                    Console.WriteLine($"{name}吃午饭");
                    break;
                default:
                    Console.WriteLine($"{name}不知道该干什么了。");
                    break;
            }
        }

              money = 8000;

  陆.多播委托 :二个富含四个艺术的信托

         }

  六.1:不要借助于为委托扩大方法时的次第,即使神跡看起来1致。

         public int Money
         {
             get { return money; }

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图