其实他们两个都是委托【代理】的简写形式。html
1、【action<>】指定那些只有输入参数,没有返回值的委托性能
Delegate的代码:代理
[csharp] htm
public delegate void myDelegate(string str); blog
public static void HellowChinese(string strChinese) get
{ string
Console.WriteLine("Good morning," + strChinese); it
Console.ReadLine(); io
} 效率
myDelegate d = new myDelegate(HellowChinese);
d("Mr wang");
用了Action以后呢:
[csharp]
public static void HellowChinese(string strChinese)
{
Console.WriteLine("Good morning," + strChinese);
Console.ReadLine();
}
Action<string> action = HellowChinese;
action("Spring.");
就是至关于省去了定义委托的步骤了。
2、func<> 这个和上面的那个是同样的,区别是这个有返回值!
[csharp] www.2cto.com
public static string HelloEnglish(string strEnglish)
{
return "Hello." + strEnglish;
}
Func<string, string> f = HelloEnglish;
Console.WriteLine(f("Srping ji"));
Console.ReadLine();
Func是一种委托,这是在3.5里面新增的,2.0里面咱们使用委托是用Delegate,Func位于System.Core命名空间下,使用委托能够提高效率,例如在反射中使用就能够弥补反射所损失的性能。
Action<T>和Func<T,TResult>的功能是同样的,只是Action<T>没有返类型,
Func<T,T,Result>:有参数,有返回类型
Action,则既没有返回也没有参数,
Func<T,TResult> 的表现形式分为如下几种:
1。Func<T,TResult>
2。Func<T,T1,TResult>
3。Func<T,T1,T2,TResult>
4。Func<T,T1,T2,T3,TResult>
5。Func<T,T1,T2,T3,T4,TResult>
分别说一下各个参数的意义,TResult表示 委托所返回值 所表明的类型, T,T1,T2,T3,T4表示委托所调用的方法的参数类型,
如下是使用示例:
Func<int, bool> myFunc = null;//所有变量
myFunc = x => CheckIsInt32(x); //给委托封装方法的地方 使用了Lambda表达式
private bool CheckIsInt32(int pars)//被封装的方法
{
return pars == 5;
}
bool ok = myFunc(5);//调用委托
MSDN:http://msdn.microsoft.com/zh-cn/library/bb534303(VS.95).aspx
可是若是咱们须要所封装的方法不返回值,增么办呢?就使用Action!
可使用 Action<T1, T2, T3, T4>委托以参数形式传递方法,而不用显式声明自定义的委托。封装的方法必须与此委托定义的方法签名相对应。也就是说,封装的方法必须具备四个均经过值传递给它的参数,而且不能返回值。(在 C# 中,该方法必须返回 void。在 Visual Basic 中,必须经过 Sub…End Sub 结构来定义它。)一般,这种方法用于执行某个操做。
使用方法和Func相似!
MSDN:http://msdn.microsoft.com/zh-cn/library/bb548654(VS.95).aspx
Action:既没有返回,也没有参数,使用方式以下:
Action action = null;//定义action
action = CheckIsVoid;//封装方法,只须要方法的名字
action();//调用
总结:使用Func<T,TResult>和Action<T>,Action而不使用Delegate其实都是为了简化代码,使用更少的代码达到相同的效果,不须要咱们显示的声明一个委托,Func<T,TResult>的最后一个参数始终是返回类型,而Action<T,TResult>是没有返回类型的,而Action是没有返回类型和参数输入的。