旗下导航:搜·么
当前位置:网站首页 > .Net教程 > 正文

C#中托付和匿名托付的详细引见【C#.Net教程】,csharp,.net,介绍

作者:搜教程发布时间:2019-11-27分类:.Net教程浏览:25评论:0


导读:这篇文章主要为人人细致引见了C#托付与匿名托付的相干材料,具有一定的参考价值,感兴趣的小伙伴们能够参考一下本来是想写一篇《托付与lambda表达式的宿世此生》,但仅托付部份...
这篇文章主要为人人细致引见了C#托付与匿名托付的相干材料,具有一定的参考价值,感兴趣的小伙伴们能够参考一下

本来是想写一篇《托付与lambda表达式的宿世此生》,但仅托付部份已写了许多内容,因而就此离开关于Lambda表达是的内容后续再写吧。

不晓得Lambda表达式是谁发明的,只记得第一次打仗Lambda表达式是在运用VS2008的时刻,那就先以为是微软发明的吧。

Lambda表达式从我打仗最先到如今变得愈来愈盛行,Java8中最先支撑、kotlin更是对C#,F#做了普遍的剽窃(C#曾几何时不也云云对待过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赋值的=右端是什么东西呢?此时编译器并不能准确辨认这是一个要领,由于要领的定义须要满足包括:接见修身符、返回范例、要领名、参数列表、要领体五部份内容。虽然你内心清晰这是个简化了的要领,然则编译器不懂你的心.........,那没紧要只需我们通知编译器,背面的是个简化要领就能够了。


static void Main(string[] args)
    {

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

正如你所希冀的那样,如今编译器已晓得了=右边是你经由简化的要领;ok,如今能够一般赋值并运用了。

经由过程上面的定义我们发明,用delegate标注的简化要领没有一个像Add/Sub一样牢固的名字。因而我们称这类要领叫匿名托付(我习惯称匿名要领)。

你能够还注意到该匿名托付定义终了后就赋值给Main代码快中的局部变量method,因而当超越method的作用域后,该要领就再也没有时机挪用了。这引出了匿名要领、匿名托付、匿名函数它们的最常见用法,即用来定义只须要运用一次的功用代码。

以上就是C#中托付和匿名托付的详细引见的细致内容,更多请关注ki4网别的相干文章!

标签:csharp.net介绍


欢迎 发表评论: