http://stackoverflow.com/questions/4317479/func-vs-action-vs-predicate
The difference between Func
and Action
is simply whether you want the delegate to return a value (use Func
) or not (use Action
).
Func
is probably most commonly used in LINQ - for example in projections:
list.Select(x => x.SomeProperty)
or filtering:
list.Where(x => x.SomeValue == someOtherValue)
or key selection:
list.Join(otherList, x => x.FirstKey, y => y.SecondKey, ...)
Action
is more commonly used for things like List<T>.ForEach
: execute the given action for each item in the list. I use this less often than Func
, although I do sometimes use the parameterless version for things like Control.BeginInvoke
and Dispatcher.BeginInvoke
.
Predicate
is just a special cased Func<T, bool>
really, introduced before all of the Func
and most of the Action
delegates came along. I suspect that if we'd already had Func
and Action
in their various guises, Predicate
wouldn't have been introduced... although it does impart a certain meaning to the use of the delegate, whereas Func
and Action
are used for widely disparate purposes.
Predicate
is mostly used in List<T>
for methods like FindAll
and RemoveAll
.
Func用于有返回值的方法,Action用于没有返回值的方法
Func<string> 表示一个有返回值的函数,返回值为string,但是函数没有参数
Func<stirng,string> 表示一个有返回值的函数,返回值为string,函数参数为string
Action<string> 表示一个无返回值的函数,函数参数为string
Action b = Method; private static void Method() { } Action<string> a = Method; private static void Method(string str) { }
Func<string> a = Method; private static string Method() { return string.Empty; } Func<string, string> b = Method; private static string Method(string str) { return string.Empty; }