Most of us would know what is delegate. But many us of don't use them
efficient enough. In this project, I have shown different methods to use
delegates. This is extremely basic example for delegate. You can use these
techniques and then can build up complex logics and architectures. It helps
a lot for Interface supporting/driven application i.e. embedded systems.
Introduction:
Delegate is a reference to one or more methods that can be called up by a
single call. It is like a 'Function Pointer ' of 'C' Language. Delegate is
method without code.
Code: I have made for classes delegatesExample1, delegatesExample2,
delegatesExample3 and delegatesExample4 which is having start method.
1) Main thread
static void Main(string[]
args)
{
new delegatesExample1().Start();
new delegatesExample2().Start();
new delegatesExample3().Start();
new delegatesExample4().Start();
Console.ReadKey();
}
Here, I have called start method of each example class. Now I'll be
explaining each class one by one.
2) Example 1
class delegatesExample1
{
delegate void MyMethod(String str);
public delegatesExample1()
{
Console.WriteLine("Delegate
Example 1 Starts");
}
public void Start()
{
MyMethod methodsToCall
= null;
methodsToCall += new MyMethod(reverseString);
methodsToCall += new MyMethod(uppercaseString);
methodsToCall("Nilay");
}
void reverseString(String str)
{
char[] arr = str.ToCharArray();
Array.Reverse(arr);
Console.WriteLine("Reverse:
" + new string(arr));
}
void uppercaseString(String str)
{
Console.WriteLine("Uppercase:
" + str.ToUpper());
}
}
In this class I have first defined delegate MyMethod accepting string.
Then in 'Start()' method, I'm attaching or binding methods to the delegate.
And then invoking that delegate instance which will subsequently call all
the methods attached to that delegate. In this example method
'reverseString' and 'uppercaseString' will be called up.
3) Example 2
class delegatesExample2
{
delegate void MyMethod(String str);
event MyMethod MyMethodEvent
= null;
public delegatesExample2()
{
Console.WriteLine("\nDelegate
Example 2 Starts");
}
public void Start()
{
MyMethodEvent += (reverseString);
MyMethodEvent += (uppercaseString);
MyMethodEvent("Nilay");
//FOLLOWING CODE CAN ALSO BE USED
//TO CALL ALL THE METHODS RELATED TO
EVENT
MyMethodEvent.Invoke("Joshi");
}
void reverseString(String str)
{
char[] arr = str.ToCharArray();
Array.Reverse(arr);
Console.WriteLine("Reverse:
" + new string(arr));
}
void uppercaseString(String str)
{
Console.WriteLine("Uppercase:
" + str.ToUpper());
}
}
In previous example we have created delegate instance and we were
directly invoking that instance.
But In this example I have created an event for my delegate. This is a
common way to expose an event for custom controls. An instance of an event
has been created and been invoked.
4) Example 3
class delegatesExample3
{
delegate void MyMethod(String str);
public delegatesExample3()
{
Console.WriteLine("\nDelegate
Example 3 Starts");
}
public void Start()
{
extraProcessing(reverseString);
extraProcessing2(uppercaseString, reverseString);
extraProcessing3(delegate(String str)
{
Console.WriteLine("Method
defined in function call:");
Console.WriteLine(str);
}
);
MyMethod methodObj
= null;
methodObj += new MyMethod(reverseString);
methodObj += new MyMethod(uppercaseString);
extraProcessing3(methodObj);
}
void extraProcessing(MyMethod method1)
{
Console.WriteLine("Passed
function as a parameter: ");
method1("Nilay");
}
void extraProcessing2(MyMethod meth1, MyMethod meth2)
{
Console.WriteLine("Passed
2 Functions as a Parameter:");
Console.WriteLine("1st
Function:");
meth1("Nilay");
Console.WriteLine("2st
Function:");
meth2("Joshi");
}
void extraProcessing3(MyMethod method1)
{
method1("nj");
}
void reverseString(String str)
{
char[] arr = str.ToCharArray();
Array.Reverse(arr);
Console.WriteLine("Reverse:
" + new string(arr));
}
void uppercaseString(String str)
{
Console.WriteLine("Uppercase:
" + str.ToUpper());
}
}
This is very interesting example. In this example delegate is passed
as a parameter to the function.
In extraProcessing1 and extraProcessing2, I have passed method name
directly.
In extaProcessing3, using delegate I defined Anonymous method and passed it
as a parameter.
In last, againg I made instance of a delegate and attached two methods to
that instance and passed that instance to the function.
5) Example 4
class delegatesExample4
{
delegate String MyMethod(String str);
public delegatesExample4()
{
Console.WriteLine("\nDelegate
Example 4 Starts");
}
public void Start()
{
CallMe( delegate(string x)
{
return x.ToLower();
}
);
}
void CallMe(MyMethod meth1)
{
Console.WriteLine("Hello
" + meth1("Nilay"));
}
}
This example shows another use of a delegate returning value.
In this example, I have shown how to use delegate returning a value.
Closing Notes:
I hope this these examples have cleared basic idea of delegate. Please
provide me your feedback about my article or any other suggestions.
Total Code:
class Program
{
static void Main(string[]
args)
{
new delegatesExample1().Start();
new delegatesExample2().Start();
new delegatesExample3().Start();
new delegatesExample4().Start();
Console.ReadKey();
}
}
class delegatesExample1
{
delegate void MyMethod(String str);
public delegatesExample1()
{
Console.WriteLine("Delegate
Example 1 Starts");
}
public void Start()
{
MyMethod methodsToCall
= null;
methodsToCall += new MyMethod(reverseString);
methodsToCall += new MyMethod(uppercaseString);
methodsToCall("Nilay");
}
void reverseString(String str)
{
char[] arr =
str.ToCharArray();
Array.Reverse(arr);
Console.WriteLine("Reverse:
" + new string(arr));
}
void uppercaseString(String str)
{
Console.WriteLine("Uppercase:
" + str.ToUpper());
}
}
class delegatesExample2
{
delegate void MyMethod(String str);
event MyMethod MyMethodEvent
= null;
public delegatesExample2()
{
Console.WriteLine("\nDelegate
Example 2 Starts");
}
public void Start()
{
MyMethodEvent += (reverseString);
MyMethodEvent += (uppercaseString);
MyMethodEvent("Nilay");
//FOLLOWING CODE CAN ALSO BE USED
//TO CALL ALL THE METHODS RELATED
TO EVENT
MyMethodEvent.Invoke("Joshi");
}
void reverseString(String str)
{
char[] arr =
str.ToCharArray();
Array.Reverse(arr);
Console.WriteLine("Reverse:
" + new string(arr));
}
void uppercaseString(String str)
{
Console.WriteLine("Uppercase:
" + str.ToUpper());
}
}
class delegatesExample3
{
delegate void MyMethod(String str);
public delegatesExample3()
{
Console.WriteLine("\nDelegate
Example 3 Starts");
}
public void Start()
{
extraProcessing(reverseString);
extraProcessing2(uppercaseString, reverseString);
extraProcessing3(delegate(String str)
{
Console.WriteLine("Method
defined in function call:");
Console.WriteLine(str);
}
);
MyMethod methodObj
= null;
methodObj += new MyMethod(reverseString);
methodObj += new MyMethod(uppercaseString);
extraProcessing3(methodObj);
}
void extraProcessing(MyMethod method1)
{
Console.WriteLine("Passed
function as a parameter: ");
method1("Nilay");
}
void extraProcessing2(MyMethod meth1, MyMethod meth2)
{
Console.WriteLine("Passed
2 Functions as a Parameter:");
Console.WriteLine("1st
Function:");
meth1("Nilay");
Console.WriteLine("2st
Function:");
meth2("Joshi");
}
void extraProcessing3(MyMethod method1)
{
method1("nj");
}
void reverseString(String str)
{
char[] arr =
str.ToCharArray();
Array.Reverse(arr);
Console.WriteLine("Reverse:
" + new string(arr));
}
void uppercaseString(String str)
{
Console.WriteLine("Uppercase:
" + str.ToUpper());
}
}
class delegatesExample4
{
delegate String MyMethod(String str);
public delegatesExample4()
{
Console.WriteLine("\nDelegate
Example 4 Starts");
}
public void Start()
{
CallMe( delegate(string x)
{
return x.ToLower();
}
);
}
void CallMe(MyMethod meth1)
{
Console.WriteLine("Hello
" + meth1("Nilay"));
}
}
Output: