天天看點

Func與Action

平時我們如果要用到委托一般都是先聲明一個委托類型,比如:

private delegate string Say();      

string說明适用于這個委托的方法的傳回類型是string類型,委托名Say後面沒有參數,說明對應的方法也就沒有傳入參數。

寫一個适用于該委托的方法:

public static string SayHello()
        {
            return "Hello";
        }      

最後調用:

static void Main(string[] args)
        {
            Say say = SayHello;
            Console.WriteLine(say());
        }      

這裡我們先聲明委托,然後再将方法傳給該委托。有沒有辦法可以不定義委托變量呢?

答案是肯定的,我們可以用Func.

Func是.NET裡面的内置委托,它有很多重載。

Func<TResult>:沒有傳入參數,傳回類型為TResult的委托。就像我們上面的Say委托,就可以用Func<string>來替代,調用如下:

static void Main(string[] args)
        {
            Func<string> say = SayHello;
            //Say say = SayHello;
            Console.WriteLine(say());
        }      

怎麼樣,有了Func很簡單吧。看一下Func别的重載。

Func<T, TResult> 委托:有一個傳入參數T,傳回類型為TResult的委托。如:

//委托 傳入參數類型為string,方法傳回類型為int
     Func<string, int> a = Count;      
//對應方法
        public int Count(string num)
        {
            return Convert.ToInt32(num);
        }      

Func<T1, T2, TResult> 委托:有兩個傳入參數:T1與T2,傳回類型為TResult。

類似的還有Func(T1, T2, T3, TResult) 委托、Func(T1, T2, T3, T4, TResult) 委托等。用法差不多,都是前面為方法的傳入參數,最後一個為方法的傳回類型。

Func也可以與匿名方法一起使用如:

Func與Action
public static void Main()
        {
            Func<string, int, string[]> extractMeth = delegate(string s, int i)
            {
                char[] delimiters = new char[] { ' ' };
                return i > 0 ? s.Split(delimiters, i) : s.Split(delimiters);
            };

            string title = "The Scarlet Letter";
            // Use Func instance to call ExtractWords method and display result
            foreach (string word in extractMeth(title, 5))
                Console.WriteLine(word);
        }      
Func與Action

同樣它也可以接 lambda 表達式

Func與Action
public static void Main()
   {
      char[] separators = new char[] {' '};
      Func<string, int, string[]> extract = (s, i) => 
           i > 0 ? s.Split(separators, i) : s.Split(separators) ;

      string title = "The Scarlet Letter";
      // Use Func instance to call ExtractWords method and display result
      foreach (string word in extract(title, 5))
         Console.WriteLine(word);
   }      
Func與Action

 Func都是有傳回類型的,如果我們的方法沒有傳回類型該怎麼辦呢?铛铛铛,這時Action就要粉墨登場了。

Action 委托:沒有傳入參數,也沒有傳回類型,即Void。如:

Func與Action
static void Main(string[] args)
        {
            Action say = SayHello;
            say();
        }
        public static void SayHello( )
        {
           Console.WriteLine("Say Hello");
        }      
Func與Action

Action<T> 委托:傳入參數為T,沒有傳回類型。如:

Func與Action
static void Main(string[] args)
        {
            Action<string> say = SayHello;
            say("Hello");
        }
        public static void SayHello(string word )
        {
            Console.WriteLine(word);
        }      
Func與Action

Action<T1, T2> 委托:兩個傳入參數,分别為T1與T2,沒有傳回類型。

Action同樣的還有許多其它重載,每個重載用法一樣,隻是方法的傳入參數數量不一樣。

其實Action與Func的用法差不多,差别隻是一個有傳回類型,一個沒有傳回類型,當然Action也可以接匿名方法和Lambda表達式。

匿名方法:

Func與Action
static void Main(string[] args)
        {
            Action<string> say = delegate(string word)
            {
                Console.WriteLine(word);
            };
            say("Hello Word");
        }      
Func與Action

Lambda表達式:

static void Main(string[] args)
        {
            Action<string> say = s => Console.WriteLine(s);
            say("Hello Word");
        }      

如果我的文章對你有幫助,就點一下推薦吧.(*^__^*)

private delegate string Say();      
public static string SayHello()
        {
            return "Hello";
        }      
static void Main(string[] args)
        {
            Say say = SayHello;
            Console.WriteLine(say());
        }      
static void Main(string[] args)
        {
            Func<string> say = SayHello;
            //Say say = SayHello;
            Console.WriteLine(say());
        }      
//委托 傳入參數類型為string,方法傳回類型為int
     Func<string, int> a = Count;      
//對應方法
        public int Count(string num)
        {
            return Convert.ToInt32(num);
        }      
Func與Action
public static void Main()
        {
            Func<string, int, string[]> extractMeth = delegate(string s, int i)
            {
                char[] delimiters = new char[] { ' ' };
                return i > 0 ? s.Split(delimiters, i) : s.Split(delimiters);
            };

            string title = "The Scarlet Letter";
            // Use Func instance to call ExtractWords method and display result
            foreach (string word in extractMeth(title, 5))
                Console.WriteLine(word);
        }      
Func與Action
Func與Action
public static void Main()
   {
      char[] separators = new char[] {' '};
      Func<string, int, string[]> extract = (s, i) => 
           i > 0 ? s.Split(separators, i) : s.Split(separators) ;

      string title = "The Scarlet Letter";
      // Use Func instance to call ExtractWords method and display result
      foreach (string word in extract(title, 5))
         Console.WriteLine(word);
   }      
Func與Action
Func與Action
static void Main(string[] args)
        {
            Action say = SayHello;
            say();
        }
        public static void SayHello( )
        {
           Console.WriteLine("Say Hello");
        }      
Func與Action
Func與Action
static void Main(string[] args)
        {
            Action<string> say = SayHello;
            say("Hello");
        }
        public static void SayHello(string word )
        {
            Console.WriteLine(word);
        }      
Func與Action
Func與Action
static void Main(string[] args)
        {
            Action<string> say = delegate(string word)
            {
                Console.WriteLine(word);
            };
            say("Hello Word");
        }      
Func與Action
static void Main(string[] args)
        {
            Action<string> say = s => Console.WriteLine(s);
            say("Hello Word");
        }