Monday, October 9, 2017

C# delegates

A delegate is socalled reference type possessing certain qualities of C pointer, but meant for methods. Yeah, exactly, you can use a delegate to pass around a method with a compatible signature of absolutely any class. Here is what a delegate looks like:

using System;

namespace MyConsoleApp
{
    delegate void MyDelegate();

    class A
    {
        public void SayYourName()
        {
            Console.WriteLine("My name is A");
        }
    }

    class B
    {
        public void SayYourName()
        {
            Console.WriteLine("My name is B");
        }
    }

    class C
    {
        public static void SayYourName()
        {
            Console.WriteLine("My name is C");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var a = new A();
            var b = new B();

            MyDelegate ADelegate = a.SayYourName;
            MyDelegate BDelegate = b.SayYourName;
            MyDelegate CDelegate = C.SayYourName;

            ADelegate();
            BDelegate();
            CDelegate();
        }
    }
}

As you can see it doesn't care whose method it refers to or if its static or not. Also one delegate may contain other delegates. Such a delegate is called multicast delegate and it looks like this:

using System;

 namespace MyConsoleApp
{
    delegate void MyDelegate();

    class A
    {
        public void SayYourName()
        {
            Console.WriteLine("My name is A");
        }
    }

    class B
    {
        public void SayYourName()
        {
            Console.WriteLine("My name is B");
        }
    }

    class C
    {
        public static void SayYourName()
        {
            Console.WriteLine("My name is C");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var a = new A();
            var b = new B();

            MyDelegate ADelegate = a.SayYourName;
            MyDelegate BDelegate = b.SayYourName;
            MyDelegate CDelegate = C.SayYourName;

            ADelegate += BDelegate + CDelegate;
            ADelegate(); // Now ADelegate is multicast delegate
        }
    }
}

If you want, you can exclude certain delegate or delegates from multicast delegate list:

using System;

 namespace MyConsoleApp
{
    delegate void MyDelegate();

    class A
    {
        public void SayYourName()
        {
            Console.WriteLine("My name is A");
        }
    }

    class B
    {
        public void SayYourName()
        {
            Console.WriteLine("My name is B");
        }
    }

    class C
    {
        public static void SayYourName()
        {
            Console.WriteLine("My name is C");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var a = new A();
            var b = new B();

            MyDelegate ADelegate = a.SayYourName;
            MyDelegate BDelegate = b.SayYourName;
            MyDelegate CDelegate = C.SayYourName;

            ADelegate += BDelegate + CDelegate;
            ADelegate -= BDelegate; // BDelegate has been excluded from ADelegate list
            ADelegate();
        }
    }
}

No comments:

Post a Comment