- Action Delegate
- This delegate allows us to encapsulate a method that is not going to return anything, i.e its return type is void.
- The numerous overloads provided range from 0 to 16 and they are all generic, meaning they can all have different types based on your needs.
- Since it covers till 16 input arguments, I feel that it is good enough to cover most of the cases. If your function needs more than 16 inputs, its probably a good time to refactor the function.
- Func Delegate
- The difference between this delegate and Action delegate is that Func allows for return types.
- It also provides numerous overloads similar to Action delegate. The last type defined is considered to be the return type.
- Similar to Action delegates, I think that this is good enough to cover most of the scenarios.
public class A03ActionAndFunc { internal static void Run() { Action<string, int> someMethod1; Action<string, int, double> someMethod2; Func<string, string> someMethod3; Func<string, int, string> someMethod4; // based on business logic, we can decide which actual method to call someMethod1 = Example1; someMethod2 = Example2; someMethod3 = Example3; someMethod4 = Example4; someMethod1("someMethod1", 5); someMethod2("someMethod2", 5, 5.6); Console.WriteLine(someMethod3("someMethod3")); Console.WriteLine(someMethod4("someMethod4", 5)); } private static void Example1(string s, int i) { Console.WriteLine("Args: " + s + ", " + i); } private static void Example2(string s, int i, double d) { Console.WriteLine("Args: " + s + ", " + i + ", " + d); } private static string Example3(string s) { return s.ToUpper(); } private static string Example4(string s, int i) { return s.ToUpper() + ", " + i; } }In the above example -
- The definition of someMethod3 suggests that it will take 1 input of type string and it will output type string.
- The definition of someMethod4 suggests that it will take 2 inputs. One of type string and the other of type int. The output type will be string.
The output looks like: