zoukankan      html  css  js  c++  java
  • Func 委托 和 Action 委托 初步谈论

    继上篇EventHandler之后,继续填坑,简单了解下Func<TResult> 委托 和 Action 委托.

    msdn对于两者的解释:

    Func<TResult>:封装一个不具有参数但却返回 TResult 参数指定的类型值的方法。

    Action:封装一个方法,该方法不具有参数并且不返回值。

    两者的区别在于:有无返回值。

    至于 Func<T,TResult>、Func<T1,T2,TResult>....

           Action<T>、Action<T1, T2>.... ,就是参数个数的区别了 。

    借用msdn上面的例子来说明两者的使用方式:

    Func<TResult>:

    using System;
    using System.IO;
    
    public class TestDelegate
    {
       public static void Main()
       {
          OutputTarget output = new OutputTarget();
          Func<bool> methodCall = output.SendToFile;
          if (methodCall())
             Console.WriteLine("Success!"); 
          else
             Console.WriteLine("File write operation failed.");
       }
    }
    
    public class OutputTarget
    {
       public bool SendToFile()
       {
          try
          {
             string fn = Path.GetTempFileName();
             StreamWriter sw = new StreamWriter(fn);
             sw.WriteLine("Hello, World!");
             sw.Close();
             return true;
          }  
          catch
          {
             return false;
          }
       }
    }

    您可以按照以下示例所演示的那样在 C# 中将 Func<TResult> 委托与匿名方法一起使用。

    using System;
    using System.IO;
    
    public class Anonymous
    {
       public static void Main()
       {
          OutputTarget output = new OutputTarget();
          Func<bool> methodCall = delegate() { return output.SendToFile(); };
          if (methodCall())
             Console.WriteLine("Success!"); 
          else
             Console.WriteLine("File write operation failed.");
       }
    }
    
    public class OutputTarget
    {
       public bool SendToFile()
       {
          try
          {
             string fn = Path.GetTempFileName();
             StreamWriter sw = new StreamWriter(fn);
             sw.WriteLine("Hello, World!");
             sw.Close();
             return true;
          }  
          catch
          {
             return false;
          }
       }
    }
    

      您也可以按照以下示例所演示的那样将 lambda 表达式分配给 Func<T, TResult> 委托。

    using System;
    using System.IO;
    
    public class Anonymous
    {
       public static void Main()
       {
          OutputTarget output = new OutputTarget();
          Func<bool> methodCall = () => output.SendToFile(); 
          if (methodCall())
             Console.WriteLine("Success!"); 
          else
             Console.WriteLine("File write operation failed.");
       }
    }
    
    public class OutputTarget
    {
       public bool SendToFile()
       {
          try
          {
             string fn = Path.GetTempFileName();
             StreamWriter sw = new StreamWriter(fn);
             sw.WriteLine("Hello, World!");
             sw.Close();
             return true;
          }  
          catch
          {
             return false;
          }
       }
    }
    

      

    再来看 Action<> 的使用:

    using System;
    using System.Windows.Forms;
    
    public class Name
    {
       private string instanceName;
    
       public Name(string name)
       {
          this.instanceName = name;
       }
    
       public void DisplayToConsole()
       {
          Console.WriteLine(this.instanceName);
       }
    
       public void DisplayToWindow()
       {
          MessageBox.Show(this.instanceName);
       }
    }
    
    public class testTestDelegate
    {
       public static void Main()
       {
          Name testName = new Name("Koani");
          Action showMethod = testName.DisplayToWindow;
          showMethod();
       }
    }

    您也可以按照以下示例所演示的那样在 C# 中将 Action 委托与匿名方法一起使用。

    using System;
    using System.Windows.Forms;
    
    public class Name
    {
       private string instanceName;
    
       public Name(string name)
       {
          this.instanceName = name;
       }
    
       public void DisplayToConsole()
       {
          Console.WriteLine(this.instanceName);
       }
    
       public void DisplayToWindow()
       {
          MessageBox.Show(this.instanceName);
       }
    }
    
    public class Anonymous
    {
       public static void Main()
       {
          Name testName = new Name("Koani");
          Action showMethod = delegate() { testName.DisplayToWindow();} ;
          showMethod();
       }
    }

    您也可以按照以下示例所演示的那样将 lambda 表达式分配给 Action 委托实例。

    using System;
    using System.Windows.Forms;
    
    public class Name
    {
       private string instanceName;
    
       public Name(string name)
       {
          this.instanceName = name;
       }
    
       public void DisplayToConsole()
       {
          Console.WriteLine(this.instanceName);
       }
    
       public void DisplayToWindow()
       {
          MessageBox.Show(this.instanceName);
       }
    }
    
    public class LambdaExpression
    {
       public static void Main()
       {
          Name testName = new Name("Koani");
          Action showMethod = () => testName.DisplayToWindow();
          showMethod();
       }
    }

    慢慢积累,加油

  • 相关阅读:
    Python(九)Tornado web 框架
    Python(九) Python 操作 MySQL 之 pysql 与 SQLAchemy
    Python(八)进程、线程、协程篇
    Python(七)Socket编程、IO多路复用、SocketServer
    Python(六)面向对象、异常处理、反射、单例模式
    Python(五)模块
    Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化
    Python基础知识三
    Python基础知识二
    Python基础知识一
  • 原文地址:https://www.cnblogs.com/lc-ant/p/4226191.html
Copyright © 2011-2022 走看看