【问题标题】:Using Func type within C# application [closed]在 C# 应用程序中使用 Func 类型 [关闭]
【发布时间】:2014-05-23 17:48:49
【问题描述】:

我有一个 C# 应用程序,我想在其中使用 Func 类型:

public static decimal rate(decimal a)
{
    return (a < 100) ? a * 3 : a * 2;
}
public static bool EstInfereiurA(decimal a)
{
    return a < 200;
}
public static Func<decimal, decimal> ratefunc = (a) =>
{
    return (a < 100) ? a * 3 : a * 2;
};

public static void Main() {
    decimal a; 
    Console.WriteLine("donner a = ");
    a = decimal.Parse(Console.ReadLine());
    Console.WriteLine(" a est t il inférieur à 200 ? {0} ", EstInfereiurA(ratefunc.Invoke(a)));
    Console.ReadKey();
    Console.WriteLine(" a est t il inférieur à 200 ? {0} ", EstInfereiurA(rate(a)));
    Console.ReadKey();
 }

我的示例运行良好,但是我需要知道使用Func 类型的优点是什么,以及它提高了代码的可读性。

  1. 在哪些情况下建议使用Func
  2. 它有什么优势?

【问题讨论】:

    标签: c# .net lambda delegates func


    【解决方案1】:

    您可以将FuncAction 视为可在.net 框架中使用的简单快捷方式。如果您只需要一个接收一些参数并具有返回值的委托,请使用 Func,如果您只需要一个没有任何参数的委托,请使用 Action。

    如果您要使用的委托类型在应用程序中没有任何特定含义,您应该主要使用 Func。换句话说,如果你想指定一堆方法进行二进制计算,那么一定要创建委托:

    public delegate int BinaryCalculate(int a, int b);
    

    这样可以清楚地表明该方法是进行二进制计算,并且更具可读性。但是,如果您创建的委托只是为了某个目的而存在,而您并不真正关心它的名称,或者它永远不会被多次使用,只需使用框架中提供给您的快捷方式即可。

    除了我上面提到的,就效率而言,使用其中一个或另一个没有任何特定的优点或缺点。

    【讨论】:

      【解决方案2】:

      在大多数情况下,如果您需要其他人为您提供功能,您会使用 Func。 Aa Farhad 指出它用于委托。在您的情况下, Func 对静态方法没有意义。一个用例是,如果您想提供一种默认方法并允许其他人用他们自己的方法替换它。下面的代码在实际应用中没有意义,但它至少应该给出一个示例用法:

      class MainClass
      {
          public static void Main(string[] args)
          {
              var n = 5m;
      
              Console.WriteLine(Executioner.GetRate(n)); // -> prints 15
              // provides a new method to be called
              Executioner.GetRateFunc = a => a * 2;
              Console.WriteLine(Executioner.GetRate(n)); // -> prints 10
          }
      }
      
      public static class Executioner
      {
          private static decimal MyGetRate(decimal a)
          {
              return (a < 100) ? a * 3 : a * 2;
          }
      
          public static Func<decimal, decimal> GetRateFunc { get; set; }
      
          public static decimal GetRate(decimal a)
          {
              var f = GetRateFunc ?? MyGetRate;
      
              return f (a);
          }
      }
      

      【讨论】:

        【解决方案3】:

        Func 对于能够传递函数调用很有用(另请参阅 Action 以了解返回 void 的 lambda)。它们形成了引用特定委托的通用方式,而不必在使用时显式声明和命名每个委托。这对于将语法简化为通用定义的函数(例如 Linq 方法使用的函数)特别有用。

        通常,调用委托比调用函数稍慢,因此在您的示例中,最好将 ratefunc 声明为方法。使用 Actions/Funcs 的最大地方是在 Linq 中,当需要以某种特定方式(例如,在某种事务中或在特定线程中)执行代码时作为参数

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-11
          相关资源
          最近更新 更多