কম্পিউটার

C# এ প্রতিনিধিদের ধারণা ব্যাখ্যা কর।


আপনি যদি একজন সি প্রোগ্রামার হন, তাহলে প্রতিনিধিদের ফাংশনের নির্দেশক হিসাবে ভাবা যেতে পারে। যাইহোক, C# এ প্রতিনিধিরা একটি সাধারণ ফাংশন পয়েন্টারের চেয়ে অনেক বেশি। এই নিবন্ধটি প্রতিনিধিদের ধারণা এবং প্রতিদিনের প্রোগ্রামিংয়ে তাদের ব্যবহার ব্যাখ্যা করে৷

মূলত, প্রতিনিধিরা পরোক্ষ একটি স্তর প্রদান করে। তারা কোডের একটি অংশকে এনক্যাপসুলেট করে যা চারপাশে পাস করা যায় এবং টাইপ-নিরাপদ উপায়ে কার্যকর করা যায়। অবিলম্বে আচরণ কার্যকর করার পরিবর্তে, এটি একটি বস্তুর মধ্যে রয়েছে। এমন একাধিক ক্রিয়া রয়েছে যা আপনি সেই বস্তুতে সম্পাদন করতে পারেন, এবং তার মধ্যে একটি হল আচরণের মধ্যে থাকা।

ডেলিগেট ব্যবহার করে আমাদের উচ্চ-ক্রম ফাংশন লিখতে দেয়, যেমন ফাংশনগুলি পরামিতি হিসাবে ফাংশন গ্রহণ করতে পারে বা রিটার্ন মান হিসাবে ফাংশন ফেরত দিতে পারে। প্রতিনিধি টাইপ পদ্ধতির স্বাক্ষরকে সংজ্ঞায়িত করে যা প্রতিনিধি প্রতিনিধিত্ব করতে পারে, বিশেষ করে পদ্ধতির রিটার্ন টাইপ এবং এর প্যারামিটারের ধরন। নিম্নলিখিত উদাহরণে, ট্রান্সফরমার হল এমন একটি প্রতিনিধি যে কোনও পদ্ধতির প্রতিনিধিত্ব করতে পারে যা একটি পূর্ণসংখ্যা গ্রহণ করে এবং ফেরত দেয়।

delegate int Transformer(int x);

আমরা ট্রান্সফরমারের একটি উদাহরণের জন্য যে কোনো পদ্ধতি (ল্যাম্বডাস, ইনস্ট্যান্স, বা স্ট্যাটিক পদ্ধতি সহ) বরাদ্দ করতে পারি যা স্বাক্ষর পূরণ করে। যেমন −

Transformer square = x => x * x;
Transformer cube = x => x * x * x;

Console.WriteLine(square(3)); // prints 9
Console.WriteLine(cube(5)); // prints 125

কখন ডেলিগেট ব্যবহার করবেন?

ডেলিগেট সাধারণত ব্যবহার করা হয় যখন কিছু ক্রিয়া সম্পাদন করতে চায় সেই কোডটি সেই ক্রিয়াগুলি কী হওয়া উচিত তার বিশদ বিবরণ জানে না কিন্তু সেই ক্রিয়াগুলির ইন্টারফেস জানে৷

প্রোগ্রামিং-এ, আমরা প্রায়শই এমন পরিস্থিতির মুখোমুখি হই যেখানে আমাদের একটি নির্দিষ্ট ক্রিয়া সম্পাদন করতে হবে, কিন্তু আমরা আগে থেকে জানি না যে আমরা এটি কার্যকর করার জন্য কোন পদ্ধতিতে আহ্বান জানাতে চাই। প্রতিনিধিরা সেই আচরণটিকে প্রতিনিধির সাথে প্রতিস্থাপন করে এবং প্রেক্ষাপট এবং পরিস্থিতির প্রয়োজন অনুসারে উপযুক্ত আচরণের সাথে সেই প্রতিনিধির একটি সুনির্দিষ্ট উদাহরণ পাস করে এই সমস্যাটি সমাধান করতে আমাদের সহায়তা করে৷

একজন প্রতিনিধিকে কিছু করার জন্য, চারটি জিনিস ঘটতে হবে -

1) প্রতিনিধি প্রকার ঘোষণা করা প্রয়োজন।

ডেলিগেট টাইপ মূলত এটি যে ফাংশনটি প্রতিনিধিত্ব করছে তার সংজ্ঞা, যেমন এতে ফাংশনটি যে প্যারামিটার টাইপগুলি গ্রহণ করবে এবং একটি রিটার্ন টাইপ যা এটি প্রদান করে তা নিয়ে গঠিত৷

উদাহরণস্বরূপ, একটি প্রতিনিধি টাইপ যা একটি পদ্ধতির প্রতিনিধিত্ব করে যা ইনপুট হিসাবে দুটি সংখ্যা গ্রহণ করে এবং একটি সংখ্যা প্রদান করে −

হিসাবে ঘোষণা করা যেতে পারে
delegate int Processor(int numOne, int numTwo);

প্রসেসর হল একটি টাইপ, একটি ক্লাস দ্বারা তৈরি একটি টাইপের অনুরূপ। এই ধরনের একটি উদাহরণ তৈরি করতে, আপনার একটি পদ্ধতির প্রয়োজন যা ইনপুট হিসাবে দুটি সংখ্যা নেয় এবং একটি বুল ফেরত দেয়৷

2) কার্যকর করা কোডটি অবশ্যই একটি পদ্ধতিতে থাকতে হবে।

একটি পদ্ধতি সংজ্ঞায়িত করুন যেটিতে উপরের প্রতিনিধি টাইপের মতো একই স্বাক্ষর রয়েছে এবং এটি রানটাইমের পরিস্থিতি অনুসারে আপনি যা চান তা করে। উদাহরণস্বরূপ, প্রসেসরের একটি দৃষ্টান্ত তৈরি করতে নিম্নলিখিত পদ্ধতিগুলির মধ্যে যেকোনো একটি ব্যবহার করা যেতে পারে, কারণ তারা সকলেই দুটি সংখ্যা নেয় এবং একটি সংখ্যা ফেরত দেয়৷

static int Add(int numOne, int numTwo){
   Return numOne + numTwo;
}
static int Subtract(int numOne, int numTwo){
   Return numOne - numTwo;
}

3) একটি প্রতিনিধি উদাহরণ তৈরি করতে হবে।

এখন আপনার কাছে একটি প্রতিনিধি প্রকার এবং সঠিক স্বাক্ষর সহ একটি পদ্ধতি রয়েছে, আপনি সেই প্রতিনিধি প্রকারের একটি উদাহরণ তৈরি করতে পারেন। এটি করার সময়, আমরা মূলত C# কম্পাইলারকে এই পদ্ধতিটি কার্যকর করার জন্য বলছি যখন ডেলিগেট ইন্সট্যান্স আহ্বান করা হয়।

Processor processorOne = new Processor(Add);
Processor processorTwo = new Processor(Subtract);

উপরের উদাহরণটি অনুমান করে যে যোগ এবং বিয়োগ পদ্ধতি একই ক্লাসে সংজ্ঞায়িত করা হয়েছে যেখানে আমরা প্রতিনিধির উদাহরণ তৈরি করছি। যদি পদ্ধতিগুলি একটি ভিন্ন শ্রেণীতে সংজ্ঞায়িত করা হয়, তাহলে আমাদের সেই শ্রেণীর উদাহরণের প্রয়োজন হবে।

4) প্রতিনিধি দৃষ্টান্তটি অবশ্যই আহ্বান করতে হবে।

এটি শুধুমাত্র প্রতিনিধি উদাহরণে একটি পদ্ধতি কল করার একটি বিষয়, যার নাম দেওয়া হয়েছে, আশ্চর্যজনকভাবে ইনভোক নয়। প্রতিনিধি উদাহরণের এই পদ্ধতিতে পরামিতি এবং রিটার্ন টাইপের একই তালিকা রয়েছে যা প্রতিনিধি টাইপ ঘোষণা নির্দিষ্ট করে। আমন্ত্রণ কল করা প্রতিনিধি উদাহরণের ক্রিয়া সম্পাদন করবে৷

int sum = processorOne.Invoke(3, 5);

যাইহোক, C# এটি আরও সহজ করে তোলে। আপনি সরাসরি ডেলিগেট ইন্সট্যান্সকে আহ্বান করতে পারেন যেন এটি নিজেই একটি পদ্ধতি। উদাহরণস্বরূপ,

int difference = processorTwo(10, 6);

প্রতিনিধিদের একত্রিত করা এবং অপসারণ করা

যদি আমরা একটি প্রতিনিধি উদাহরণের একক আহ্বান সহ বিভিন্ন কর্মের একটি তালিকা সম্পাদন করতে চাই, C# আমাদের তা করতে দেয়। পদ্ধতি. ডেলিগেট টাইপের দুটি স্ট্যাটিক পদ্ধতি রয়েছে, যাকে বলা হয় একত্রিত এবং সরান।

1. একত্রিত করুন

একটি আমন্ত্রণ তালিকা সহ একটি নতুন প্রতিনিধি তৈরি করে যা প্যারামিটার হিসাবে পাস করা প্রতিনিধিদের আমন্ত্রণ তালিকাগুলিকে সংযুক্ত করে৷ যখন নতুন ডেলিগেট ইন্সট্যান্স আহ্বান করা হয়, তখন এর সমস্ত কাজ ক্রমানুসারে সম্পাদিত হয়।

public static Delegate Combine(params Delegate[] delegates); // OR
public static Delegate Combine(Delegate a, Delegate b);

আমন্ত্রণ তালিকার যেকোনও ক্রিয়া যদি একটি ব্যতিক্রম ছুঁড়ে দেয়, যা পরবর্তী ক্রিয়াগুলি সম্পাদন করা থেকে বাধা দেয়৷

2. সরান

অন্য প্রতিনিধির আমন্ত্রণ তালিকা থেকে একজন প্রতিনিধির আহ্বান তালিকার শেষ ঘটনাটি সরিয়ে দেয়। উত্সের আমন্ত্রণ তালিকা গ্রহণ করে এবং মূল্যের আমন্ত্রণ তালিকার শেষ ঘটনাটি সরিয়ে একটি আমন্ত্রণ তালিকার সাথে একটি নতুন প্রতিনিধি ফেরত দেয়৷

public static Delegate Remove(Delegate source, Delegate value);

সারাংশ

  • প্রতিনিধিরা একক-পদ্ধতি ইন্টারফেসের মতো একটি নির্দিষ্ট প্রকার এবং প্যারামিটারের সেট সহ আচরণকে এনক্যাপসুলেট করে।

  • প্রতিনিধি টাইপ ঘোষণা দ্বারা বর্ণিত টাইপ স্বাক্ষর নির্ধারণ করে যে কোন পদ্ধতিগুলি প্রতিনিধি দৃষ্টান্ত তৈরি করতে ব্যবহার করা যেতে পারে এবং আহ্বানের জন্য স্বাক্ষর৷

  • একটি প্রতিনিধি দৃষ্টান্ত তৈরি করার জন্য এমন একটি পদ্ধতির প্রয়োজন যা আমরা যখন প্রতিনিধিকে আহ্বান করা হয় তখন তা কার্যকর করতে চাই৷

  • প্রতিনিধি দৃষ্টান্তগুলি অপরিবর্তনীয়, স্ট্রিংয়ের মতো।

  • ডেলিগেট দৃষ্টান্তগুলির প্রতিটিতে একটি আমন্ত্রণ তালিকা থাকে - কর্মের একটি তালিকা৷

  • প্রতিনিধি দৃষ্টান্ত একে অপরের সাথে একত্রিত এবং সরানো যেতে পারে।

উদাহরণ

using System;
class Program{
   delegate int Transformer(int x);
   delegate int Processor(int numOne, int numTwo);
   static void Main(){
      Transformer square = x => x * x;
      Transformer cube = x => x * x * x;
      Console.WriteLine(square(3)); // prints 9
      Console.WriteLine(cube(5)); // prints 125
      Processor processorOne = new Processor(Add);
      Processor processorTwo = new Processor(Subtract);
      int sum = processorOne.Invoke(3, 5);
      Console.WriteLine(sum); // prints 8
      int difference = processorTwo(10, 6);
      Console.WriteLine(difference); // prints 4
   }
   static int Add(int numOne, int numTwo){
      return numOne + numTwo;
   }
   static int Subtract(int numOne, int numTwo){
      return numOne - numTwo;
   }
}

আউটপুট

9
125
8
4

  1. সি প্রোগ্রামিং-এ অ্যারে অফ পয়েন্টার এবং পয়েন্টার থেকে পয়েন্টার ধারণাটি ব্যাখ্যা কর

  2. C ভাষায় ক্যারেক্টার অপারেশন ব্যাখ্যা কর

  3. সি ল্যাঙ্গুয়েজে পয়েন্টার এক্সেসিংয়ের ধারণাটি ব্যাখ্যা কর

  4. C# এ একটি শ্রেণীর ধারণা ব্যাখ্যা কর।