Func和Action委託

 Func和Action是兩個泛型委託,爲什麼說他們有用呢?是由於這兩個自帶的委託在很多時候可以省去我們自定義委託的工作。

    1.Func

     該委託有5個重載形式,區別僅在於他所指向的方法的簽名的參數個數,分別如下:

  • Func<TResult>
  • Func<T,TResult>
  • Func<T1,T2,TResult>
  • unc<T1,T2,T3,TResult>
  • Func<T1,T2,T3,T4,TResult>

     其中T,T1,..T4是委託指向的方法的參數的類型,TResult爲方法的返回類型

     舉個例子,在學習委託的時候需要用委託來寫個計算平方的小程序,您可以這樣實現:

test自定義委託
test自定義委託
class Program
   {
        private delegate int CalcSquare(int size);
 
       public static void Main()
       {
            CalcSquare cal = Square;
 
           Console.Write("the square of {0} is {1}", 10, cal(10));
       }
        private  static int Square(int size)
       {
            return size*size;
       }
    }

 

首先需要聲明一個委託:CalcSquare,如果用Func這個內置的委託來實現,則可以如下:

test用Func實現
test用Func實現
class Program
   {
        public static void Main()
       {
            Func<int,int> cal = Square;
 
           Console.Write("the square of {0} is {1}", 10, cal(10));
       }
        private  static int Square(int size)
       {
            return size*size;
       }
    }

可見,省去了自定義委託的那步。

您可能會說,Func的重載都是需要有返回值的,但是如果我的方法不需要返回值呢?OK,這就該輪到Action出場了。

2.Action

    同樣,Action也有以下幾種重載形式:

  • Action
  • Action<T>
  • Action<T1,T2>
  • Action<T1,T2,T3>
  • Action<T1,T2,T3,T4>

    稍稍改下上面的例子:

test自定義委託
test自定義委託
    class Program
   {
        private delegate void CalcSquare(int size);
 
       public static void Main()
       {
            CalcSquare cal = size=>Console.WriteLine("the square od {0} is {1}", size, size * size);
 
           cal(10);
       }
    }

    同樣的您需要先聲明一個委託。

test用Action實現
test用Action實現
    class Program
   {
        public static void Main()
       {
            Action<int> cal = size=>Console.WriteLine("the square od {0} is {1}", size, size * size);
 
           cal(10);
       }
    }

 

   總結:Func和Action是兩個比較有用的委託,能解決我們的很多需求。當然,有時候如果您覺得給委託起個容易理解的名字很重要,也可以去自定義委託,畢竟工作量也不大,是吧。

在4.0這兩個委託又有了變化,現在可支持達16個參數!

發佈了88 篇原創文章 · 獲贊 16 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章