Skip to main content

Delegates :: Advance : C# programming for c++ programmers


1. Definition: 

A Delegate is a type safe function pointers and it hold reference(i.e. Pointer) to a function. 

  • Delegates are like reference types like classes and interfaces. Unlike structures are value type.
  • The reasont o say delegate as type safe because  delegate must match the signature of the function, the delegate points to, otherwise you get a compiler error.



Syntax:  Same a member function with a keyword delegate


public delegate void func(string param);


class demo
{
    public static void Main()
    {
        // ignature must match the signature of the delegate
        func del = new func(method);

        // Invoke the delegate, which will invoke the method
        del("Hello from Delegte");
    }


    public static void method(string param)
    {
        Console.WriteLine(param);
    }
}


Note:

Compare parameter of the method and delegate parameters and return type. If the parameters don't match then it would lead to the compiler error.


2. Why Delegates:

 Here in below example, the employee is promoted if the salary is greater than 5000, let say if some other organization wants to have a different rule for promotion. In such case reusable, since we have hard coded value, hence it is not flexible.

Example: 

class demo
    {
        public static void main()
        {
            List list_org = new List();
            list_org.Add(new organization() { empId = 101, Name = "iliyas", salary = 5000 });
            list_org.Add(new organization() { empId = 101, Name = "patel", salary = 2000 });
            list_org.Add(new organization() { empId = 101, Name = "kabir", salary = 6000 });

            organization.promoteemp(list_org);
        
        }
    }

    class organization
    {
        public int empId { get; set; }
        public string  Name { get; set; }
        public int salary { get; set; }

        public static bool promoteemp(List list_org)
        {
            foreach (organization orgn in list_org)
            {
                if (orgn.salary >= 5000)
                {
                    Console.WriteLine("Promoted : " + orgn.Name);
                }
            }
        }

    }




With Delegate:

class demo
    {
        public static void main()
        {
            List list_org = new List();
            list_org.Add(new organization() { empId = 101, Name = "iliyas", salary = 5000 });
            list_org.Add(new organization() { empId = 101, Name = "patel", salary = 2000 });
            list_org.Add(new organization() { empId = 101, Name = "kabir", salary = 6000 });

   IsPromotable isPromote = new IsPromotable(Promote);



            organization.promoteemp(list_org, isPromote);
        
        }

public bool Promote(Employee emp)
        {
            if(emp.salary >= 5000)
return true
   else
return false;
        } 
    }
    
    

    delegate bool IsPromotable(List list_org);

    class organization
    {
        public int empId { get; set; }
        public string  Name { get; set; }
        public int salary { get; set; }

        public static bool promoteemp(List list_org, IsPromotable IsEligible)
        {
            foreach (organization orgn in list_org)
            {
                if (IsEligible(orgn))
                {
                    Console.WriteLine("Promoted : " + orgn.Name);
                }
            }
        }

    }






With Delegate using Lambda expression:



class demo
    {
        public static void main()
        {
            List list_org = new List();
            list_org.Add(new organization() { empId = 101, Name = "iliyas", salary = 5000 });
            list_org.Add(new organization() { empId = 101, Name = "patel", salary = 2000 });
            list_org.Add(new organization() { empId = 101, Name = "kabir", salary = 6000 });

   organization.promoteemp(list_org, emp=>emp.salary >= 5000);
        
        }

    }
    
    



    delegate bool IsPromotable(List list_org);

    class organization
    {
        public int empId { get; set; }
        public string  Name { get; set; }
        public int salary { get; set; }

        public static bool promoteemp(List list_org, IsPromotable IsEligible)
        {
            foreach (organization orgn in list_org)
            {
                if (IsEligible(orgn))
                {
                    Console.WriteLine("Promoted : " + orgn.Name);
                }
            }
        }

    }

Comments

Popular posts from this blog

const used with functions

const used with functions : class Dog {    int age;    string name; public:    Dog() { age = 3; name = "dummy"; }         // const parameters and these are overloaded functions    void setAge(const int& a) { age = a; }    void setAge(int& a) { age = a; }         // Const return value    const string& getName() {return name;}         // const function and these are overloaded functions    void printDogName() const { cout << name << "const" << endl; }  // value of name can't be modified    void printDogName() { cout << getName() << " non-const" << endl; } }; int main() {    Dog d;    d.printDogName();        const Dog d2;    d2.printDogName();     }

Structured Bindings

Returning multiple Values from function C++ 11 vs C++ 17 Returning compound objects Iterating over a compound collection Direct initialization Returning multiple Values from function C++ 11 vs C++ 17 :  C++ 11 (std::tie): std::tuple mytuple() {     char a = 'a';     int i = 123;     bool b = true;     return std::make_tuple(a, i, b);  // packing variable into tuple } To access return value using C++ 11, we would need something like: char a; int i; bool b; std::tie(a, i, b) = mytuple();  // unpacking tuple into variables Where the variables have to be defined before use and the types known in advance. C++ 17 : auto [a, i, b] = mytuple(); Returning compound objects :  This is the easy way to assign the individual parts of a compound type (such as a struct, pair etc) to different variables all in one go – and have the correct types automatically assigned. So let’s have a look at an ...

POST 1 : std::thread in c++ | C++ 11

std::thread   C++  Thread support library std::thread. Threads enable programs to execute across several processor cores. Defined in header Class : thread Member types : native_handle_type Data Member  id    //represents the id of a thread (public member class) Member functions (constructor)    //constructs new thread object (public member function) (destructor)    //destructs the thread object, underlying thread must be joined or detached  (public member function) operator=    //moves the thread object  Observers  // Covered in NEXT POST Operations    // Covered in NEXT POST Constructor :   #include   void f1 ( int n ) { for ( int i = 0 ; i < 5 ; ++ i ) { std:: cout << "Thread 1 executing \n " ; ++ n ; std:: this_thread :: sleep_for ( std:: chrono :: milliseconds ( 10 ) ) ; ...