天天看點

Func,Action

1、概念闡述
Func是一種委托,這是在3.5裡面新增的,2.0裡面我們使用委托是用Delegate,Func位于System.Core命名空間下,使用委托可以提升效率,例如在反射中使用就可以彌補反射所損失的性能。
Action<T>和Func<T,TResult>的功能是一樣的,隻是Action<T>沒有返類型,

Func<T,T,Result>:有參數,有傳回類型
Action,則既沒有傳回也沒有參數,
使用Func<T,TResult>和Action<T>,Action而不使用Delegate其實都是為了簡化代碼,使用更少的代碼達到相同的效果,不需要我們顯示的聲明一個委托,Func<T,TResult>的最後一個參數始終是傳回類型,而 
Action<T,TResult>是沒有傳回類型的,而Action是沒有傳回類型和參數輸入的。
2、運用
Action<T>泛型委托


描述:

    封裝一個方法,該方法隻采用一個參數并且不傳回值.

文法:

    public delegate void Action<T>(T arg);

T:

    參數類型:此委托封裝的方法的參數類型

arg:

    參數:此委托封裝的方法的參數

備注:

    通過此委托,可以将方法當做參數進行傳遞.其他形式:

    public 
delegate void Action<T1, T2>(T1 arg1, T2 arg2);
    public delegate 
void Action<T1, T2, T3>(T1 arg1, T2 arg2, T3 arg3);
    public delegate 
void Action<T1, T2, T3, T4>(T1 arg1, T2 arg2, T3 arg3, T4 
arg4);
3、代碼

以下是使用示例:

Func<int, bool> myFunc = null;//全部變量

myFunc = x => CheckIsInt32(x); 
//給委托封裝方法的地方 使用了Lambda表達式

private bool CheckIsInt32(int pars)//被封裝的方法
{
  return pars == 5;
}

  bool ok = myFunc(5);//調用委托
Action 
action = null;//定義action

action =  CheckIsVoid;//封裝方法,隻需要方法的名字

action();//調用
4、線上程中的使用哦
            List<Action> actions = new List<Action>();
             actions.Add(() =>
             {
                 for (int i = 0; i < 100; i++)
                 {
                     Thread.Sleep(300);
                     lock (textboxlock)
                     {
                         this.richTextBox1.Text = this.richTextBox1.Text + System.Environment.NewLine  + ":" + i.ToString();
                     }
                 }
             });
             actions.Add(SHowMessage1);
             actions.Add(SHowMessage);
             foreach (var action in actions)
             {
                 Action a = action;
                 ThreadPool.QueueUserWorkItem(state=>a(),null);
             }      

繼續閱讀