Sunday, October 29, 2017

C# For Beginners , Part-34 ( Multicast Delegate )

আজকে আমরা মাল্টিক্যাস্ট ডেলিগেট নিয়ে আলোচনা করবো ।। ধরো আমরা একটা ডেলিগেট দিয়ে - এক এর অধিক ফাংশনকে পয়েন্ট করবো ।।
চলো আমরা সিম্পল একটা সমস্যা দেখে আসি ---------------------------------------------

using System;
using System.Collections.Generic;

public delegate void SampleDelegate();
    class Program
    {
        public static void Main(string[] args)
        {
            SampleDelegate d1, d2, d3, d4;
            d1 = new SampleDelegate(method1);
            d2 = new SampleDelegate(method2);
            d3 = new SampleDelegate(method3);
            d4 = d1 + d2 + d3;
            d4();
            Console.ReadKey();
        }
        public static void method1()
        {
            Console.WriteLine("It Is Method No.1");
        }

        public static void method2()
        {
            Console.WriteLine("It is Method No.2");
        }

        public static void method3()
        {
            Console.WriteLine("It is Method No.3");
        }
     
    }

 এখানে আমরা  SampleDelegate নামে যে ডেলিগেট ক্রিয়েট করেছি , সেটা - তিনটা মেথোড/ফাংশনকে পয়েন্ট করছে ।। আমরা ,SampleDelegate  এর জন্য  মোট  ৪ টা রেফারেন্স ভ্যারিয়েবল ক্রিয়েট করেছি ।। তারপর , আমরা SampleDelegate নামের ডেলিগেট-এর তিন তিনটা কন্সট্রাক্টরে , আমাদের তিন তিনটা মেথোডের নাম উল্লেখ করে দিয়েছি ।। এরপর , + অপারেটরের মাধ্যমে তিনটাই একসাথে করে , d4 তে অ্যাসাইন করে দিয়েছি ,এর মানে - d4 এর মাধ্যমে আমরা তিনটা মেথোডকেই পয়েন্ট করছি  ।। আর তারপর তো , d4() এর মাধ্যমে তিনটা আউটপুটই দেখাচ্ছি ।। একটা জিনিস খেয়াল রাখা উচিত , আমরা যেভাবে - যে সিরিয়ালে, d4 এ অ্যাসাইন করবো , সেই অনুযায়ি আউটপুট দেখতে পাবো ।। আমি যদি , d4=  d1 + d3 + d2 ; এভাবে লিখতাম তাহলে তুমি মেথোড-১ এর পর মেথোড-৩ আগে দেখতে , তারপর মেথোড-২ ।।

এখন ধরো , তুমি -- মেথোড-২  প্রিন্ট করবে না , তাহলে তুমি কিন্তু  d4=d1+d2+d3-d2 ; এভাবে লিখতে পারো ।। আবার , d4 = d1 + d3 ; এভাবেও লিখতে পারো ।। তোমার ইচ্ছে !!

আবার , তুমি তিনটি মেথোডকেই কল করার জন্য ,আরো একটা উপায় ইউজ করতে পারো , সেটা হলো -----------

            SampleDelegate d;
            d = new SampleDelegate(method1);
            d =d+ method2 + method3;
            d();

এর মানে , তুমি মেথোড-১ এর জন্য যে ডেলিগেট আছে , তার সাথেই - বাকি দুটি মেথোড এর রেজিস্ট্রার করানো ।। আবার তুমি , যদি যে কোনো দুইটি মেথোড রান করাতে চাও , তাহলে এভাবেও করতে পারবে ---------
            SampleDelegate d;
            d = new SampleDelegate(method1);
            d += method3;          
            d();

আচ্ছা ধরো , আমরা তো শুধু ভয়েড টাইপ নিয়েই কাজ করলাম । এখন যদি ফাংশনগুলি ---যদি ভয়েড ছাড়াও অন্যকিছু রিটার্ন করে , তাহলে কি হবে ?? তখন কোনটার'টা আসলে প্রিন্ট হবে ?? চলো দেখে আসি --

using System;
using System.Collections.Generic;

public delegate int SampleDelegate();
    class Program
    {
        public static void Main(string[] args)
        {
            SampleDelegate d;
            d = new SampleDelegate(method1);
            d += method3;
            d += method2;

            int DelegateReturnValue = d();
            Console.WriteLine(DelegateReturnValue);
           
            Console.ReadKey();
        }
        public static int method1()
        {
            return 1;
        }

        public static int method2()
        {
            return 2;
        }

        public static int method3()
        {
            return 3;
        }
     
    }


আচ্ছা , তাহলে -- আমরা তিনটা মেথোডই রেজিস্ট্রার করালাম , প্রথমটার সাথে , এখন দেখি আউটপুট-এ কোনটা'র টা দেখায় ?? রান করে দেখে নাও । হুম , সবসময়ই -- সবশেষে , যেটা অ্যাসাইন করবে সেটারই ভ্যালু দেখাবে , বিষয়টা খুব ভালো করে মাথায় রেখো ।। আউটপুট প্যারামিটারের ক্ষেত্রেও একই রকম ব্যপার হবে , বিষয়টি ,মনে রেখো ----------------

using System;
using System.Collections.Generic;

public delegate void SampleDelegate(out int n);
    class Program
    {
        public static void Main(string[] args)
        {
            SampleDelegate d;
            d = new SampleDelegate(method1);
          
            d += method2;

            int DelegateReturnValue = -1;

            d(out DelegateReturnValue);
            Console.WriteLine(DelegateReturnValue);
           
            Console.ReadKey();
        }
        public static void method1(out int n)
        {
            n= 1;
        }

        public static void method2(out int n)
        {
            n= 2;
        }
    }

 তো যা হোক , এইটুকুই । ডেলিগেট নিয়ে আরো কথা হবে -- পরে ডিতেইলস-এ ।। আপাতত এইটুকুই -----------------------






No comments:

Post a Comment