zoukankan      html  css  js  c++  java
  • 写给那些看不懂委托的同学

    C# 从1.x 发展到目前的 4.5,委托的写法真是越来越简单精悍。如果您对这些委托的写法不是很清晰,本文可以帮助到您。

    委托是一种安全封装方法的类型,可以将方法作为方法的参数。
    委派方法的参数个数、顺序、类型及方法返回值类型必须跟定义的委托方法一样,但参数名称可以不同

    1、C# 定义一个完整委托:

    delegate string SayMessage(string msg);
    static string SayHello(string Name)
    {
       return string.Format("Hello {0}", Name);
    }
    static void Main(string[] args)
    {
       SayMessage say = new SayMessage(SayHello);
       Console.WriteLine(say("委托"));
       Console.ReadKey();
    }

     输出结果:"Hello 委托"

    2、C#2.0后出现了匿名方法,可以将委托方法省略掉,直接给委托传递一个匿名方法,当然也要去掉New这个动作。

    delegate string SayMessage(string msg);
    static void Main(string[] args)
    { 
       SayMessage say = delegate(string Name)
       {
         return string.Format("Hello {0}", Name);
       };
       Console.WriteLine(say("匿名方法")); 
       Console.ReadKey();
    }

     输出结果:"Hello 匿名方法"

    3、 聪明的人们总是想使用更少的代码达到相同的效果。因此C#3.0 之后出现了 Lambda表达式、Action委托、Func 委托

    (1) Lambda表达式:匿名方法的升级版,可以简化匿名方法的写法。写法 (形参列表)=>{ 表达式 OR 函数体 }

    delegate string SayMessage(string msg);
    static void Main(string[] args)
    {
       SayMessage say = (Name) =>
       {
          return string.Format("Hello {0}", Name);
       };
       Console.WriteLine(say("Lambda"));
       Console.ReadKey();
    }

     输出结果:"Hello Lambda"

    通过看上面的代码,能否将定义的委托 SayMessage 也去掉吗?当然可以,用 Func委托 或者 Action委托 就可以取代它!

    (2)Func 委托:当我们封装一个具有返回值方法的时候就可以使用Func委托。

    Func 委托一共有 15种重载,但总会有一个返回值,比如我们示例中用到的Func<T, TResult>委托就是其中之一。

    Func<T, TResult>的作用就是 封装一个具有一个T类型参数并返回 TResult 类型值参数的方法。

    如果封装方法没有有输入参数则直接使用Func<TResult> 委托。

    static void Main(string[] args)
    {
      Func<string, string> say1 = delegate(string Name)
       {
         return string.Format("Hello {0}", Name);
       };
       //和Lambda 结合
       Func<string, string> say2 = (Name) =>
       {
         return string.Format("Hello {0}", Name);
       };
       Console.WriteLine(say1("Func 委托"));
       Console.WriteLine(say2("Func 委托")); 
       Console.ReadKey();
    }

      输出结果:"Hello Func 委托"

    (3)Action委托:当我们封装一个没有返回参数的方法时,就可以使用Action委托。

    Action委托也有 15种重载,封装的方法可有有输入参数,但不会有返回参数。

    比如下面示例代码中用到的Action<T>委托,其作用就是 封装一个具有T类型参数且无返回值参数 的方法。

    如果封装方法没有输入参数则可以直接使用 Action 委托。

    static void Main(string[] args)
    {
      Action<string> say1 = delegate(string Name)
      {
        Console.WriteLine(string.Format("Hello {0}", Name));
      };
       //和Lambda 结合
      Action<string> say2 = (Name)=>
      {
        Console.WriteLine(string.Format("Hello {0}", Name));
      };
      say1("Action 委托");
      say2("Action 委托");
      Console.ReadKey();
    }

     输出结果:"Hello Action 委托"

    作者:Rising Sun
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    苹果mac shell 终端 命令行快捷键——行首行尾
    mac 编译ffmpeg真简单!
    (2)小彩灯接收数据解析
    JSON数据解析(自写)
    ESP-手机--双向通信模式
    史上最全脉搏心率传感器PulseSensor资料(电路图+中文说明书+最全源代码)
    OpenSCAD 大白
    用OpenSCAD設計特製的遊戲骰子
    如何使用openscad绘制一个简单的键帽.
    OpenSCAD(1)基础教程
  • 原文地址:https://www.cnblogs.com/lxblog/p/2935089.html
Copyright © 2011-2022 走看看