zoukankan      html  css  js  c++  java
  • C#中Action和Func的使用

    在日常使用delegate时,我们通常需要显示声明一个名为XXX的委托,而在使用Action委托时,不必显示定义一个封装无参数过程的委托。

    比如正常使用delegate:

     1 using System;
     2 
     3 namespace MT
     4 {
     5     public delegate void ShowValue();//在这里显示声明一个委托
     6 
     7     public class Test
     8     {
     9         //在这里有一个Test类,类中有一个void的方法,作用是输出一个字符串
    10         private string instanceName;
    11         public Test(string name)
    12         {
    13             this.instanceName = name;
    14         }
    15         public void DisplayToConsole()
    16         {
    17             Console.WriteLine(this.instanceName);
    18         }
    19     }
    20 
    21     public class Program
    22     {
    23         //在Main函数里使用委托去调用这个方法
    24         static void Main(string[] args)
    25         {
    26             Test name = new Test("Sirius");
    27             ShowValue method = name.DisplayToConsole;
    28             method();
    29             Console.ReadKey();
    30         }
    31     }
    32 }

    Action就是这么个姿势:

    1 static void Main(string[] args)
    2 {
    3     Test name = new Test("Sirius");
    4     Action method = name.DisplayToConsole;
    5     method();
    6     Console.ReadKey();
    7 }

    当然,Action也可以有签名模板,Action<T>。

    public void DisplayToConsole(string name)
    {
          Console.WriteLine(name);
    }
    Action<string> method2 = name.DisplayToConsole;
    method2("123");
    Console.ReadKey();

    说到Func,其实跟Action的区别就是,Func代理的方法必须有返回值,因为Func的重载模式是Func<T1,T2....TResult>,T几代表代理的方法的模板,也就是可以传入的参数,TResult就是代理方法的返回值。

    比如,我们把上面的DisplayToConsole方法稍作修改,改为DisplayForFunc:

    1         public void DisplayForFunc(string name)
    2         {
    3             Console.WriteLine(name);
    4         }

    这个时候使用Func委托时不行的

    Func<string, object> f = t.DisplayForFunc;

    会被告知返回类型错误,Func所适应的代理则应该是具有返回值类型的,我们再修改一下方法,让它返回一个无意义的bool值:

    1         public bool DisplayForFunc(string name)
    2         {
    3             Console.WriteLine(name);
    4             return true;
    5         }
    1         static void Main(string[] args)
    2         {
    3             Test t = new Test("Sirius");
    4             Func<string, bool> f = t.DisplayForFunc;
    5             f("123");
    6             Console.ReadKey();            
    7         }

    这样就是可以的啦!

    顺便贴一张MSDN的牛逼图,这是我第一次看MSDN看到想笑……

    代码参考:https://msdn.microsoft.com/zh-cn/library/system.action(v=vs.110).aspx

  • 相关阅读:
    实现Runnable接口和继承Thread类的区别
    图的DFS和BFS
    图建模
    数据结构-图的基本知识和表示
    除自身以外的乘积数组(力扣第238题)
    MapReduce源码分析--Shuffle阶段
    转到博客园
    vue中使用剪切板插件 clipboard.js
    vue中使用vue-qrcode生成二维码
    h5中嵌入视频自动播放的问题
  • 原文地址:https://www.cnblogs.com/xidu/p/4386464.html
Copyright © 2011-2022 走看看