C# > Functional Programming > Lambdas and Expressions > Func and Action Delegates
Func and Action Delegates: Basic Examples
This example demonstrates the basic usage of Func
and Action
delegates in C#. Func
delegates are used to encapsulate methods that have a return value, while Action
delegates encapsulate methods that return void.
Declaring and Using Func Delegate
This code snippet defines a Func
delegate named intToStringConverter
. This delegate takes an int
as input and returns a string
. The lambda expression (number) => "Number: " + number.ToString()
is assigned to the delegate. When the delegate is invoked with an integer, it converts the integer to a string and prepends "Number: " to it.
using System;
public class FuncExample
{
public static void Main(string[] args)
{
// Func delegate that takes an int and returns a string
Func<int, string> intToStringConverter = (number) => "Number: " + number.ToString();
// Use the Func delegate
string result = intToStringConverter(10);
Console.WriteLine(result); // Output: Number: 10
}
}
Declaring and Using Action Delegate
This code snippet defines an Action
delegate named printMessage
. This delegate takes a string
as input and returns void
. The lambda expression (message) => Console.WriteLine("Message: " + message)
is assigned to the delegate. When the delegate is invoked with a string, it prints the string to the console, prepended with "Message: ".
using System;
public class ActionExample
{
public static void Main(string[] args)
{
// Action delegate that takes a string and prints it to the console
Action<string> printMessage = (message) => Console.WriteLine("Message: " + message);
// Use the Action delegate
printMessage("Hello, Action Delegate!"); // Output: Message: Hello, Action Delegate!
}
}
Concepts Behind Func and Action Delegates
Func
and Action
delegates are pre-defined generic delegate types provided by the .NET framework. They simplify the process of declaring delegates by providing a ready-made template for common delegate signatures. Func
delegates represent methods that take zero or more input parameters and return a value, while Action
delegates represent methods that take zero or more input parameters and return void. They promote code reusability and are fundamental in functional programming paradigms in C#.
Real-Life Use Case
A common use case is in event handling. Imagine a UI framework where button clicks need to trigger different actions. Using Action
delegates, you can dynamically assign the action to be performed when a button is clicked, without needing to hardcode specific method calls. Another example is in data processing pipelines, where Func
delegates can be used to transform data from one format to another.
Best Practices
Func
or Action
) based on whether the method has a return value or not.
Interview Tip
Be prepared to explain the difference between Func
and Action
delegates, including their purpose and usage scenarios. Also, understand how they relate to lambda expressions and functional programming concepts. A common question is to provide an example of when you would use one over the other.
When to Use Them
Use Func
delegates when you need to encapsulate a method that returns a value and takes zero or more input parameters. Use Action
delegates when you need to encapsulate a method that returns void and takes zero or more input parameters. They are particularly useful when dealing with event handling, LINQ queries, and asynchronous operations.
Memory Footprint
The memory footprint of Func
and Action
delegates is relatively small. They are reference types, so they store a reference to the method they encapsulate. The memory overhead is primarily due to the delegate object itself and the associated metadata. However, the lambda expressions they encapsulate can have an impact depending on captured variables and object allocations.
Alternatives
Alternatives to Func
and Action
delegates include creating custom delegate types using the delegate
keyword. However, using Func
and Action
is generally preferred due to their simplicity and readability. In specific scenarios involving more complex delegate signatures or scenarios where a specific delegate name is preferred, custom delegates can be advantageous.
Pros
Func
and Action
improve code readability by clearly indicating the purpose of the delegate.
Cons
Func
and Action
may not be suitable for all scenarios, especially those requiring specific delegate names or complex signatures.
FAQ
-
What is the difference between Func and Action delegates?
Func
delegates are used to encapsulate methods that return a value, whileAction
delegates are used to encapsulate methods that return void. Both can take zero or more input parameters. -
Can I use Func and Action delegates with anonymous methods?
Yes,Func
andAction
delegates can be assigned anonymous methods or lambda expressions. This is a common and powerful way to use them. -
Are Func and Action delegates generic types?
Yes, bothFunc
andAction
are generic types.Func
can have up to 16 input parameters, and the last type parameter represents the return type.Action
can have up to 16 input parameters but doesn't have a return type parameter (it returns void).