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);
}