Delegates
class Program
{
public delegate void SomeMethodPtr();
static void Main(string[] args)
{
SomeMethodPtr obj =
new SomeMethodPtr(SomeMethod);
obj(); //or obj.Invoke();
Console.ReadLine();
}
static void SomeMethod()
{
Console.WriteLine("Some method called");
}
}
|
When we can call a method directly, what is the use of
calling a method indirectly? Basically, a delegate is a representative to
communicate between 2 parties.
The actual use of
delegates is callback
public class MyClass
{
public delegate void MyDelegate(int input);
public void
LongRunningMethod(MyDelegate _delegate)
{
for (int i = 0; i < 2000; i++)
{
_delegate(i);
}
}
}
|
static void XyzMethod(int i)
{ Console.WriteLine(i);
}
static void Main(string[] args)
{
MyClass obj = new MyClass();
obj.LongRunningMethod(XyzMethod);
Console.ReadLine();
}
|
In this example, we can pass data between the caller and the
program with the help of delegates.
Delegates are used by framework writes so that custom logic
can be injected at the time of code.
Delegate, Anonymous
Method, Action, Func, Predicate
class Program
{
static double fn_Prodvalues(int val1, int val2)
{
return val1 * val2;
}
static void Main(string[] args)
{
Delegate_Prod dpObj; double result=0;
dpObj = new Delegate_Prod(fn_Prodvalues); //
Delegate
result = dpObj(5, 6);
dpObj = delegate(int x, int y) { return x * y; }; // Anonymous Method
--introduced in c# 2.0
result = dpObj(9, 6);
dpObj = (x, y) => x * y; //
Lambda Expression -- Introduced in c# 3.0
result = dpObj(7, 8);
//Action<T> no return type
Action<int,int> action=delegate(int x, int y){Console.WriteLine(x*y);};
Action<int, int> action2 = (x, y) => Console.WriteLine(x*y); ;
action2(4, 4);
//Func<T,out
TResult> has a return type
Func<int, int, int> func = (x, y) => x * y;
result = func(5, 6);
//Predicate<T>
T is the input type, and it returns back only boolean
Predicate<int> predicate = delegate(int x) { return x > 10; };
Predicate<int> predicate2 = x => x > 10;
Console.WriteLine(predicate(9));
Console.WriteLine(result);
Console.ReadKey();
}
}
|
Another example
static void Main(string[] args)
{
List<int> lst = new List<int>() { 2, 3, 4, 5, 6, 7,
4, 3, 45, 6 };
//IEnumerable<int>result= lst.Where(x=>x>5);
IEnumerable<int> result =
lst.Where(fc); // Both Methods work
}
static
Func<int, bool> fc = delegate(int c) { return c > 5; };
|
Extension Methods
An extension method is a static method of a static class,
where the "this" modifier is applied to the first parameter
using
System;
namespace
ExtensionMethodsExample
{
public
static class Extension
{
public
static int WordCount(this string str)
{
string[] userString = str.Split(new char[] { ' ',
'.', '?' },
StringSplitOptions.RemoveEmptyEntries);
int
wordCount = userString.Length;
return
wordCount;
}
}
}
|
An extension method having the same name and signature like
as an instance method will never be called since it has low priority than
instance method.
An extension method couldn't override the existing instance
methods.
An extension method cannot be used with fields, properties
or events.
The compiler doesn't cause an error if two
extension methods with same name and signature are defined in two different
namespaces and these namespaces are included in same class file using
directives. Compiler will cause an error if you will try to call one of them
extension method.