Action, Func and
Predicate Delegate in C#
I will be explaining the following flavors in these articles:
Ø
Action is a delegate (pointer) to a method, that
takes zero, one or more input parameters, but does not return anything.
Ø
When you
want a delegate for a function that may or may not take parameters and does not
return a value.
Ø
Action is
more commonly used for things like List<T>.ForEach: execute the given
action for each item in the list..
Ø
I use these
often for anonymous event handlers:
Ø
Example
button1.Click += (sender, e) => {/* Do Some Work */}
Func
- Func is a delegate (pointer) to a method, that takes zero, one or more input parameters, and returns a value (or reference).
- When you want a delegate for a function that may or may not take parameters and returns a value.
- The most common example would be Select from LINQ:
- Example
var result = someCollection.Select( x => new { x.Name, x.Address });
Predicate is a special kind of Func often used for comparisons.
- Predicate is a delegate that takes generic parameters and returns bool
- When you want a specialized version of a Func that takes evaluates a value against a set of criteria and returns a boolean result (true for a match, false otherwise).
- Though widely used with Linq, Action and Func are concepts logically independent of Linq. C++ already contained the basic concept in form of typed function pointers.
-
Predicate<T> is a delegate that takes a T and returns
a bool.
It's completely equivalent to Func<T, bool>. - Predicate is just a special cased Func<T, bool> really, introduced before all of the Func and most of the Action delegates came along
- Predicate is mostly used in List<T> for methods like FindAll and RemoveAll.
Here is a small example for Action and
Func without using Linq:
class Program
{
static void Main(string[]
args)
{
Action<int>
myAction = new Action<int>(DoSomething);
myAction.Invoke(123); // Prints out "123"
Func<int, double>
myFunc = new Func<int, double>(CalculateSomething);
Console.WriteLine(myFunc(5)); // Prints out "2.5"
}
static void DoSomething(int
i)
{
Console.WriteLine(i);
}
static double CalculateSomething(int
i)
{
return (double)i/2;
}
}
Conclusion:
The
difference between Func and Action is simply whether you want the delegate to
return a value (use Func) or doesn't (use Action).
Happy Programming!!
Don’t forget to leave your
feedback and comments below!
If you have any query mail me to Sujeet.bhujbal@gmail.com
Regards
Sujeet Bhujbal
--------------------------------------------------------------------------------
Blog: www.sujitbhujbal.com
Personal Website :-http://sujitbhujbal.wordpress.com/
Facebook :-http://www.facebook.com/bhujbal.sujit
CodeProject:-http://www.codeproject.com/Members/Sujit-Bhujbal
Linkedin :-http://in.linkedin.com/in/sujitbhujbal
Stack-Exchange: http://stackexchange.com/users/469811/sujit-bhujbal
Twitter :-http://twitter.com/SujeetBhujbal
JavaTalks :-http://www.javatalks.com/Blogger/sujit9923/
--------------------------------------------------------------------------------