Sunday, 5 April 2015

Action, Func and Predicate Delegate in C#



Action, Func and Predicate Delegate in C#

Delegate is a very powerful feature available in the .NET Framework. In this article, we will explore delegate & its new features which are being introduced in the framework. I will be using Visual Studio 2013 for coding sample code, assuming that you do have basic knowledge of .NET C# code.
I will be explaining the following flavors in these articles:

Action
Ø  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
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

No comments:

Post a Comment