Introduction
There are many articles and blogs about delegates in the .Net Framework. I just thought to share the use of delegates and where to use them in actual projects. I shall start with a very simple console application where I have used delegates.
Before going through this article I recommend you get some knowledge of Delegates. There are many articles and blogs in c-sharpcorner.com.
Step 1: Create a Student Class
Student.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CustomDelegates
{
public class Student
{
public int RollNo { get; set; }
public string StudentName { get; set; }
public int Marks { get; set; }
public bool hasSportsQuota {get;set;}
}
}
Step 2: Create a StudentDelegate Class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CustomDelegates
{
public delegate bool DisplayEligibleStudents(Student student);
public static class StudentDelegate
{
public static void EligibleStudenList(List<Student> lstStudents, DisplayEligibleStudents eligibleStudents)
{
foreach (Student student in lstStudents)
{
if (eligibleStudents(student))
{
Console.WriteLine("Roll No : {0} , Name : {1}",student.RollNo,student.StudentName);
}
}
}
}
}
Explanation
In a normal coding scenario we write some custom login inside the function EligibleStudentList.
For example:
public static void EligibleStudenList(List<Student> lstStudents)
{
foreach (Student student in lstStudents)
{
if (lstStudents.Mark>75)
{
Console.WriteLine("Roll No : {0} , Name : {1}",student.RollNo,student.StudentName);
}
}
}
The logic is correct and the application works as expected.
Scenario: Customer wants to display all students based on varying criteria.
In this situation normally we go and rewrite the logic inside the preceding function but that is a bad approach. Here comes the role of delegates.
It would be really great if the criteria are passed as a parameter to our function EligibleStudentList.
Delegates Methodology
I have created a delegate named DisplayEligibleStudents that takes an input of type Student class and returns a Boolean value.
EligibleStudentList function takes 2 input:
- List<Student>
- DisplayEligibleStudents (Our Custom Delegate).
Step 3: Main Class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CustomDelegates
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Eligible Students....");
Console.WriteLine("**********************************************************");
// Intializing the student properties.
Student student1 = new Student { RollNo = 1001, StudentName = "Madhav", Marks = 97, hasSportsQuota = true };
Student student2 = new Student { RollNo = 1004, StudentName = "Rachel", Marks = 89, hasSportsQuota = false };
Student student3 = new Student { RollNo = 1009, StudentName = "John", Marks = 45, hasSportsQuota = true };
Student student4 = new Student { RollNo = 1002, StudentName = "James", Marks = 66, hasSportsQuota = true };
Student student5 = new Student { RollNo = 1003, StudentName = "Nike", Marks = 48, hasSportsQuota = false };
//Create a List of Students:
List<Student> lstStudents = new List<Student>();
lstStudents.Add(student1);
lstStudents.Add(student2);
lstStudents.Add(student3);
lstStudents.Add(student4);
lstStudents.Add(student5);
//Eligible criteria is marks >75
Console.WriteLine("Eligible Criteria : Marks > 75 ");
Console.WriteLine("**********************************************************");
StudentDelegate.EligibleStudenList(lstStudents, e => e.Marks > 75);
//Eligible Critertia is : Has Sports Quota
Console.WriteLine("Eligible Criteria : Students with Sports Quota");
Console.WriteLine("**********************************************************");
StudentDelegate.EligibleStudenList(lstStudents, e => e.hasSportsQuota==true);
Console.ReadLine();
}
}
}
I have provided some comments in the code. Please refer to them.
Without changing the program logic different criteria are passed to the EligibleStudentList function.
Output
By using delegates the actual logic inside the function is never changed even when there is a new change request made by the customer.
Happy Coding...