2017年9月26日 星期二

Func 委派的用法

Func 委派的用法

https://dotblogs.com.tw/brooke/2014/08/02/146142

摘要:Func 委派的用法
一、
1.委派的範例為
using System;

//宣告一個委派型別為ConvertMethod,
//並規範入為string型別,輸出為string型別
delegate string ConvertMethod(string inString);

public class DelegateExample
{
   public static void Main()
   {
      // Instantiate delegate to reference UppercaseString method
      // 將委派型別ConvertMethod的實體去參考UppercaseString方法
      ConvertMethod aConvertMeth = UppercaseString;
      string name = "Dakota";
      // Use delegate instance to call UppercaseString method
      Console.WriteLine(aConvertMeth(name));
   }

   private static string UppercaseString(string inputString)
   {
      return inputString.ToUpper();
   }
}

2.不用明確定義委派方法,以Func來簡化程式碼為
using System;

public class GenericFunc
{
    public static void Main()
    {
        // Instantiate delegate to reference UppercaseString method
        //Func<in T, out TResult>
        Func<string, string> aConvertMethod = UppercaseString;
        string name = "Dakota";
        // Use delegate instance to call UppercaseString method
        Console.WriteLine(aConvertMethod(name));
        Console.ReadKey();
    }

    private static string UppercaseString(string inputString)
    {
        return inputString.ToUpper();
    }
}

3.使用匿名方法
using System;

public class Anonymous
{
   public static void Main()
   {
      Func<string, string> convert = delegate(string s){ return s.ToUpper();}; 

      string name = "Dakota";
      Console.WriteLine(convert(name));   
   }
}

4.使用Lambda運算式
using System;

public class Anonymous
{
   public static void Main()
   {
      Func<string, string> convert = s => s.ToUpper(); 

      string name = "Dakota";
      Console.WriteLine(convert(name));   
   }
}

二、
若要參考有一個參數並傳回 void (在 Visual Basic 中是宣告為 Sub 而非 Function) 的方法,
可使用泛型 Action<T> 委派代替。
using System;

public class GenericFunc
{
    public static void Main()
    {

        Action<string> aConvertMethod = UppercaseString;
        string name = "Dakota";

        aConvertMethod(name);
        Console.ReadKey();
    }

    private static void UppercaseString(string inputString)
    {
        Console.WriteLine(inputString.ToUpper());
    }
}

三、
Action<T>泛型的委派型別,也是跟Func一樣,只是回傳值為void。
每個Func委派型別的簽章,傳入的參數會是零到四,而最後一個的型別參數是代表回傳型別。
例如:Func<string,int>,代表傳入型別為string而回型別為int。

沒有留言:

張貼留言