ইভেন্ট এবং প্রতিনিধি এবং এর সম্পর্কিত অ্যাপ্লিকেশনগুলির মধ্যে পার্থক্য [বন্ধ]


106

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

আপনি কি আমাকে পার্থক্য ব্যাখ্যা করবেন এবং কখন ব্যবহার করবেন? সুবিধা এবং অসুবিধা সমূহ কি কি? আমাদের কোডটি প্রচুর পরিমাণে ইভেন্টগুলির সাথে জড়িত এবং আমি এর নীচে যেতে চাই।

আপনি কখন ইভেন্টগুলির ওপরে প্রতিনিধি ব্যবহার করবেন? উভয়ের সাথে দয়া করে আপনার বাস্তব বিশ্বের অভিজ্ঞতা বর্ণনা করুন, প্রোডাকশন কোডটিতে বলুন।


হ্যাঁ পার্থক্যগুলির চারপাশে আমার মাথা জড়িয়ে রাখা সত্যিই শক্ত ছিল, তারা একই চেহারা দেখায় এবং প্রথম দেখায় একই কাজ করে বলে মনে হয়
রবার্ট গোল্ড


1
দুটি ইভেন্ট এবং প্রতিনিধিদের মধ্যে পার্থক্যটি আসলে মতের বিষয় নয় not প্রশ্নটি সম্পর্কিত অ্যাপ্লিকেশনগুলির জন্য জিজ্ঞাসা করে কারণ তারা প্রযুক্তিগুলির যে সমস্যার সমাধান করে তার মধ্যে পার্থক্য তুলে ধরে। এটিও মতামতের বিষয় নয় কারণ কেউ জিজ্ঞাসা করেনি কোনটি সেরা। এই প্রশ্নের কোনও অংশই মতের বিষয় নয়, এবং এই বিবৃতিটিও মতামত নয়। আমার মতে. আপনি কি আপনার ব্যাজ পেয়েছেন?
পিটার জিতেছেন

উত্তর:


48

প্রযুক্তিগত দিক থেকে, অন্যান্য উত্তরগুলি পার্থক্যগুলিকে সম্বোধন করেছে।

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

সি / সি ++ পদগুলিতে পয়েন্টারের অনুরূপ কোনও কনস্ট্রাক্টের বর্ণনা দেওয়ার জন্য একটি প্রতিনিধি আরও সাধারণ শব্দ। .নেটের সমস্ত প্রতিনিধি হ'ল মাল্টিকাস্টের প্রতিনিধি। শব্দার্থবিজ্ঞানের দৃষ্টিকোণ থেকে এগুলি সাধারণত এক ধরণের ইনপুট হিসাবে ব্যবহৃত হয়। বিশেষত, তারা কৌশল প্যাটার্নটি বাস্তবায়নের এক নিখুঁত উপায় । উদাহরণস্বরূপ, আমি যদি সামগ্রীর তালিকাকে বাছাই করতে চাই, তবে দুটি পদার্থের তুলনা কীভাবে করা যায় তা বাস্তবায়নের জন্য আমি একটি তুলনামূলক কৌশল সরবরাহ করতে পারি।

আমি উত্পাদন কোডে দুটি পদ্ধতি ব্যবহার করেছি। নির্দিষ্ট বৈশিষ্ট্য পূরণের সময় আমার প্রচুর ডেটা অবজেক্টগুলিকে অবহিত করে। সর্বাধিক মৌলিক উদাহরণ, যখনই কোনও সম্পত্তি পরিবর্তন হয়, একটি সম্পত্তি-চেঞ্জ করা ইভেন্ট উত্থাপিত হয় (INotifyPropertyChanged ইন্টারফেস দেখুন)। নির্দিষ্ট বস্তুকে স্ট্রিংয়ে রূপান্তর করার বিভিন্ন কৌশল সরবরাহ করতে আমি কোডে প্রতিনিধিদের ব্যবহার করেছি। এই নির্দিষ্ট উদাহরণটি ব্যবহারকারীর কাছে প্রদর্শন করার জন্য একটি নির্দিষ্ট বস্তুর প্রকারের জন্য বাস্তবায়নের একটি গৌরবময় ToString () তালিকা ছিল list


4
হয়তো আমি কিছু মিস করছি, তবে ইভেন্ট হ্যান্ডলারটি এক প্রকার প্রতিনিধি নয়?
পাওয়ারলর্ড

1
আমার উত্তর প্রশ্নসমূহ সম্পাদনা # 1 এবং # 2; ব্যবহারের দৃষ্টিকোণ থেকে পার্থক্য। এই আলোচনার উদ্দেশ্যে, এগুলি আলাদা, যদিও প্রযুক্তিগত দিক থেকে, আপনি সঠিক। প্রযুক্তিগত পার্থক্যের জন্য অন্যান্য উত্তরগুলি একবার দেখুন।
সিজমন রোজগা

3
"সমস্ত প্রতিনিধি। নেট কি মাল্টিকাস্ট প্রতিনিধি"? এমনকি প্রতিনিধিরাও যে মূল্য ফেরত দেয়?
কিওয়ারটি

5
হ্যাঁ. ইতিহাসের জন্য, এমএসডিএন.মাইক্রোসফটকম /en-us/magazine/cc301816.aspx দেখুন । পরীক্ষা করে দেখুন: msdn.microsoft.com/en-us/library/system.delegate.aspx । যদি তারা মানগুলি ফেরত দেয় তবে যে মানটি ফিরে আসে তা হ'ল চেইনের সর্বশেষ প্রতিনিধিকে বিলোপ করা।
সিজমন রোজগা

প্রতিনিধিরা এমন রেফারেন্স প্রকার যা গ্রাহক শ্রেণিতে সংজ্ঞায়িত ইভেন্ট হ্যান্ডলারগুলিকে নির্দেশ করে। অন্য শব্দগুলিতে, প্রতিনিধি ইভেন্ট (প্রকাশক) এবং গ্রাহক সংজ্ঞায়িত ইভেন্ট হ্যান্ডলার মধ্যে একটি লিঙ্ক হিসাবে ব্যবহৃত হয়। একটি অ্যাপ্লিকেশনটিতে, একাধিক গ্রাহককে একটি ইভেন্ট শোনার প্রয়োজন হবে এবং এই জাতীয় পরিস্থিতিতে প্রতিনিধিরা আমাদের প্রকাশক এবং গ্রাহকদের সংযোগ দেওয়ার জন্য একটি কার্যকর উপায় সরবরাহ করেন।
জোসেপেনুমকাল

54

শব্দ eventমাল্টিকাস্ট প্রতিনিধিদের জন্য একটি সুযোগ সংশোধক। এর মধ্যে ব্যবহারিক পার্থক্য এবং কেবল একটি মাল্টিকাস্ট ডেলিগেট হিসাবে ঘোষণা করা নিম্নরূপ:

  • আপনি eventএকটি ইন্টারফেস ব্যবহার করতে পারেন ।
  • মাল্টিকাস্ট ডেলিগেটের আমন্ত্রণ অ্যাক্সেস কেবল ঘোষক শ্রেণীর মধ্যে সীমাবদ্ধ। আচরণটি এমন ছিল যেন ডেলিগেটটি প্রার্থনার জন্য ব্যক্তিগত ছিল। অ্যাসাইনমেন্টের উদ্দেশ্যে, অ্যাক্সেস একটি সুস্পষ্ট প্রবেশাধিকার সংশোধক (যেমন public event) দ্বারা নির্দিষ্ট করা হয় ।

আগ্রহের বিষয় হিসাবে, আপনি আবেদন করতে পারেন +এবং -মাল্টিকাস্ট প্রতিনিধিদের কাছে +=এবং -=ইভেন্টগুলিতে প্রতিনিধিদের সম্মিলন কার্যভারের জন্য এবং সিনট্যাক্সের ভিত্তি এটি । এই তিনটি স্নিপেট সমান:

B = new EventHandler(this.MethodB);
C = new EventHandler(this.MethodC);
A = B + C;

দুটি নমুনা, সরাসরি অ্যাসাইনমেন্ট এবং সংমিশ্রণ কার্য উভয়কেই চিত্রিত করে।

B = new EventHandler(this.MethodB);
C = new EventHandler(this.MethodC);
A = B;
A += C;

নমুনা তিনটি: আরও পরিচিত সিনট্যাক্স। সমস্ত হ্যান্ডলারগুলি অপসারণ করতে আপনি সম্ভবত নালীর কার্যভারের সাথে পরিচিত।

B = new EventHandler(this.MethodB);
C = new EventHandler(this.MethodC);
A = null;
A += B;
A += C;

বৈশিষ্ট্যগুলির মতো, ইভেন্টগুলির একটি সম্পূর্ণ সিনট্যাক্স থাকে যা এখন পর্যন্ত কেউ ব্যবহার করে না। এই:

class myExample 
{
  internal EventHandler eh;

  public event EventHandler OnSubmit 
  { 
    add 
    {
      eh = Delegate.Combine(eh, value) as EventHandler;
    }
    remove
    {
      eh = Delegate.Remove(eh, value) as EventHandler;
    }
  }

  ...
}

... ঠিক এর মতো করে:

class myExample 
{
  public event EventHandler OnSubmit;
}

অ্যাড ও রিমুভ পদ্ধতিগুলি বিবি.এনইটি ব্যবহার করে এমন স্থিরীকৃত বাক্য গঠনগুলিতে আরও সুস্পষ্ট যা (কোনও অপারেটর ওভারলোড নেই)।


6
+ "" মাল্টিকাস্ট ডেলিগেটের কাছে প্রার্থনা অ্যাক্সেস কেবল ঘোষক শ্রেণীর মধ্যে সীমাবদ্ধ "- এটি আমার কাছে প্রতিনিধি এবং ইভেন্টের মধ্যে মূল পার্থক্য।
রিচার্ডড

2
আরেকটি গুরুত্বপূর্ণ পার্থক্য (নীচে আইটলসন দ্বারা উল্লিখিত) হ'ল যে কোনও ইভেন্টের দায়িত্ব অর্পণ করে সমস্ত ইভেন্ট হ্যান্ডলারদের সদস্যতা বাতিল করতে পারে না, তবে তারা প্রতিনিধিদের সাথে এটি করতে পারে। (যাইহোক, এগুলিগুলির মধ্যে আপনার কাছে আমার সবচেয়ে দরকারী উত্তর ছিল)।
রোমান স্টারকভ

4
গুগল এবং স্ট্যাকওভারফ্লো যেমন সুবিধাজনক হতে পারে, এই সমস্ত এবং আরও অনেক কিছু মাইক্রোসফ্টের কাছ থেকে বিনা শুল্কে প্রকাশিত সি # ল্যাঙ্গুয়েজ স্পেসে বিশদভাবে উপলব্ধ detail আমি জানি যে এর মুখে ,
শ্বর

12

ইভেন্টগুলি সিনট্যাকটিকাল চিনি। সেগুলো স্বুস্বাদু. আমি যখন কোন ইভেন্ট দেখি তখন কী করতে হবে তা আমি জানি। আমি যখন কোনও প্রতিনিধি দেখি তখন আমি নিশ্চিত নই।

ইন্টারফেসের (আরও চিনি) সাথে ইভেন্টগুলির সংমিশ্রণটি মুখের জল নাস্তা তৈরি করে। ডেলিগেটস এবং খাঁটি ভার্চুয়াল অ্যাবস্ট্রাক্ট ক্লাসগুলি অনেক কম ক্ষুধা দেয়।


আমি এটিও দেখি। আমি আরও গভীর এবং আরও মিষ্টি ব্যাখ্যা চাই :)

13
অত্যধিক চিনি একটি চর্বি করে, তবে ... = পি
এরিক ফোর্বস

5

ইভেন্টগুলিকে মেটাডেটাতে চিহ্নিত করা হয়। এটি উইন্ডোজ ফর্ম বা এএসপি.এনইটি ডিজাইনারের মতো জিনিসগুলিকে কেবল প্রতিনিধি প্রকারের বৈশিষ্ট্যগুলির থেকে পৃথক করে এবং তাদের জন্য উপযুক্ত সহায়তা সরবরাহ করে (বিশেষত এগুলি প্রোপার্টি উইন্ডোর ইভেন্টস ট্যাবে প্রদর্শন করে)।

প্রতিনিধি প্রকারের সম্পত্তি থেকে আর একটি পার্থক্য হ'ল ব্যবহারকারীরা ইভেন্ট হ্যান্ডলারদের কেবল যোগ করতে বা অপসারণ করতে পারে, তবে প্রতিনিধি প্রকারের সম্পত্তি সহ তারা মান নির্ধারণ করতে পারে:

someObj.SomeCallback = MyCallback;  // okay, replaces any existing callback
someObj.SomeEvent = MyHandler;  // not okay, must use += instead

এটি ইভেন্টের গ্রাহকদের আলাদা করতে সহায়তা করে: আমি একটি ইভেন্টে আমার হ্যান্ডলারটি যুক্ত করতে পারি এবং আপনি একই হ্যান্ডলারটিকে একই ইভেন্টে যুক্ত করতে পারেন এবং আপনি ঘটনাক্রমে আমার হ্যান্ডলারটিকে ওভাররাইট করতে পারবেন না।


4

যদিও ঘটনাগুলি মাল্টিকাস্ট প্রতিনিধিদের সাথে সাধারণত প্রয়োগ করা হয় তবে এ জাতীয় ফ্যাশনে সেগুলি ব্যবহার করার কোনও প্রয়োজন নেই। কোনও শ্রেণি যদি ইভেন্টটি প্রকাশ করে তবে এর অর্থ ক্লাস দুটি পদ্ধতি প্রকাশ করে। তাদের অর্থগুলি হ'ল সংক্ষেপে:

  1. এখানে একটি প্রতিনিধি। আকর্ষণীয় কিছু ঘটলে দয়া করে এটি প্রার্থনা করুন।
  2. এখানে একটি প্রতিনিধি। আপনার যত তাড়াতাড়ি সুবিধাজনক (এবং আর এটি কল করবেন না) এর সমস্ত রেফারেন্স নষ্ট করা উচিত।

কোনও শ্রেণীর দ্বারা প্রকাশিত ইভেন্টটি পরিচালনা করার সর্বাধিক সাধারণ উপায় হ'ল একটি মাল্টিকাস্ট ডেলিগেটকে সংজ্ঞায়িত করা এবং উপরোক্ত পদ্ধতিগুলিতে পাস হওয়া কোনও প্রতিনিধি যুক্ত / অপসারণ করা কিন্তু তাদের সেভাবে কাজ করার কোনও প্রয়োজন নেই। দুর্ভাগ্যক্রমে, ইভেন্ট আর্কিটেকচার এমন কিছু কিছু করতে ব্যর্থ হয়েছে যা বিকল্প পদ্ধতিতে অনেক ক্লিনার তৈরি করতে সক্ষম হত (যেমন সাবস্ক্রিপশন পদ্ধতিতে কোনও মেথথইনোওকারকে ফিরিয়ে আনতে হবে; যা গ্রাহক দ্বারা রাখা হবে; কোনও অনুষ্ঠানকে সাবস্ক্রাইব করতে, কেবল ফিরে আসা পদ্ধতিটিই প্রার্থনা করতে পারে) সুতরাং মাল্টিকাস্ট প্রতিনিধিরা এখন পর্যন্ত সবচেয়ে সাধারণ পদ্ধতির হয়।


4

পার্থক্য বুঝতে আপনি এই 2 উদাহরণ দেখতে পারেন

প্রতিনিধিদের সাথে উদাহরণ দিন (এই ক্ষেত্রে পদক্ষেপ যে এক ধরণের প্রতিনিধি যা মান ফেরত দেয় না)

public class Animal
{
    public Action Run {get; set;}

    public void RaiseEvent()
    {
        if (Run != null)
        {
            Run();
        }
    }
}

প্রতিনিধি ব্যবহার করার জন্য আপনার এই জাতীয় কিছু করা উচিত

Animale animal= new Animal();
animal.Run += () => Console.WriteLine("I'm running");
animal.Run += () => Console.WriteLine("I'm still running") ;
animal.RaiseEvent();

এই কোডটি ভাল কাজ করে তবে আপনার কিছু দুর্বল দাগ থাকতে পারে।

উদাহরণস্বরূপ যদি আমি এটি লিখি

animal.Run += () => Console.WriteLine("I'm running");
animal.Run += () => Console.WriteLine("I'm still running");
animal.Run = () => Console.WriteLine("I'm sleeping") ;

কোডের শেষ লাইনের সাথে আমি পূর্ববর্তী আচরণগুলি কেবল একটি অনুপস্থিতের সাথে ওভাররাইড +করেছিলাম (এর +পরিবর্তে আমি ব্যবহার করেছি +=)

আরেকটি দুর্বল স্পট হ'ল আপনার Animalক্লাস ব্যবহার করা প্রতিটি শ্রেণি RaiseEventকেবল এটি কল করতে পারে animal.RaiseEvent()

এই দুর্বল দাগগুলি এড়াতে eventsআপনি সি # তে ব্যবহার করতে পারেন ।

আপনার পশুর শ্রেণিটি এভাবে পরিবর্তিত হবে

public class ArgsSpecial :EventArgs
   {
        public ArgsSpecial (string val)
        {
            Operation=val;
        }

        public string Operation {get; set;}
   } 



 public class Animal
    {
       public event EventHandler<ArgsSpecial> Run = delegate{} //empty delegate. In this way you are sure that value is always != null because no one outside of the class can change it

       public void RaiseEvent()
       {  
          Run(this, new ArgsSpecial("Run faster"));
       }
    }

ইভেন্ট কল করতে

 Animale animal= new Animal();
 animal.Run += (sender, e) => Console.WriteLine("I'm running. My value is {0}", e.Operation);
 animal.RaiseEvent();

পার্থক্য:

  1. আপনি কোনও সরকারী সম্পত্তি নয় বরং একটি সর্বজনীন ক্ষেত্র ব্যবহার করছেন না (ইভেন্টগুলির সাথে সংকলকটি আপনার ক্ষেত্রগুলি অযাচিত অ্যাক্সেস থেকে সুরক্ষা দেয়)
  2. ইভেন্টগুলি সরাসরি বরাদ্দ করা যায় না। এক্ষেত্রে আপনি আচরণটিকে ওভাররাইড করে আগের ত্রুটিটি করতে পারবেন না।
  3. আপনার শ্রেণীর বাইরের কেউ ইভেন্টটি তুলতে পারবেন না।
  4. ইভেন্টগুলি একটি ইন্টারফেস ঘোষণায় অন্তর্ভুক্ত করা যায়, যেখানে কোনও ক্ষেত্র পারে না

মন্তব্য

ইভেন্টহ্যান্ডলারকে নিম্নলিখিত প্রতিনিধি হিসাবে ঘোষণা করা হয়েছে:

public delegate void EventHandler (object sender, EventArgs e)

এটি প্রেরকের (অবজেক্ট টাইপের) এবং ইভেন্টের আর্গুমেন্টগুলিতে লাগে। প্রেরক যদি স্থির পদ্ধতি থেকে আসে তবে তা বাতিল হয়।

আপনি এর EventHAndlerপরিবর্তে এই উদাহরণটি ব্যবহার করতে পারেনEventHandler<ArgsSpecial>

পড়ুন এখানে EventHandler সম্পর্কে নথিপত্রের জন্য


3

সম্পাদনা # 1 আপনি কখন ইভেন্ট এবং বনাম.ভার্সার উপর প্রতিনিধিদের ব্যবহার করবেন? উভয়ের সাথে দয়া করে আপনার বাস্তব বিশ্বের অভিজ্ঞতা বর্ণনা করুন, প্রোডাকশন কোডটিতে বলুন।

আমি যখন নিজের নিজস্ব এপিআইগুলি ডিজাইন করি, তখন আমি প্রতিনিধিদের সংজ্ঞায়িত করি যা পদ্ধতিগুলিতে বা শ্রেণীর নির্মাতাদের পরামিতি হিসাবে পাস করা হয়:

  • যাতে কোনও পদ্ধতি একটি সাধারণ 'টেম্পলেট পদ্ধতি' প্যাটার্ন কার্যকর করতে পারে (যেমন, Predicateএবং Actionডেলিগেটগুলি। নেট জেনেরিক সংগ্রহের ক্লাসে পাস করা হয়)
  • বা যাতে শ্রেণি একটি 'কলব্যাক' করতে পারে (সাধারণত এটি তৈরি করা শ্রেণীর কোনও পদ্ধতির কলব্যাক)।

এই প্রতিনিধিরা সাধারণত রান-টাইমে অ-alচ্ছিক হয় (যেমনটি হবে না null)।

আমি ঘটনা ব্যবহার না করার ঝোঁক; কিন্তু যেখানে আমি ব্যবহারের ঘটনা না, আমি তাদের জন্য ব্যবহার ঐচ্ছিকরূপে করার সংকেত ঘটনা শূন্য, এক, বা তার বেশি ক্লায়েন্ট শক্তি আগ্রহী হতে, অর্থাত্ যখন এটি অর্থে যে একটি শ্রেণী (যেমন তোলে System.Windows.Formবর্গ) অস্তিত্ব উচিত এবং চালানোর হোক বা না হোক যে কোনো ক্লায়েন্ট হয়েছে তার ইভেন্টে আমি একটি ইভেন্ট হ্যান্ডলার জোড়া হয়েছে (উদাঃ ফর্ম এর 'মাউস নিচে' ইভেন্ট বিদ্যমান, কিন্তু এটা ঐচ্ছিক কিনা কোন বাইরের ক্লায়েন্ট যে ঘটনা সম্মুখে একটি ইভেন্ট হ্যান্ডলার ইনস্টল আগ্রহী)।


2

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


সম্পাদনা: আমি মনে করি আমার ব্যবহারের ধরণগুলির মধ্যে পার্থক্যটি হ'ল, ঘটনাগুলিকে উপেক্ষা করার জন্য আমি এটি পুরোপুরি গ্রহণযোগ্য বলে মনে করি, সেগুলি হুক / স্টাবস, যদি ইভেন্টটির বিষয়ে আপনার জানতে প্রয়োজন হয় তবে তাদের শুনুন, যদি আপনি যত্ন না নেন ইভেন্টটি কেবল এটিকে উপেক্ষা করুন। এজন্য আমি এগুলিকে ইউআই, জাভাস্ক্রিপ্ট / ব্রাউজার ইভেন্ট শৈলীর জন্য ব্যবহার করি। তবে আমার যখন কোনও প্রতিনিধি থাকে তখন আমি অবশ্যই প্রত্যাশা করি যে কেউ এই প্রতিনিধিটির কাজ পরিচালনা করবে এবং যদি পরিচালনা না করা হয় তবে ব্যতিক্রম ছুঁড়ে ফেলবে।


আমি যেমন ইউআই-তে সন্ধ্যা ব্যবহার করি, আপনি কি সে সম্পর্কে বিস্তারিত বলতে চান? একটি ভাল উদাহরণ যথেষ্ট হবে .... ধন্যবাদ

1

অনুষ্ঠান এবং প্রতিনিধিদের মধ্যে পার্থক্যটি আমি যা ভাবতাম তার চেয়ে অনেক কম .. আমি এই বিষয়ে একটি সুপার শর্ট ইউটিউব ভিডিও পোস্ট করেছি: https://www.youtube.com/watch?v=el-kKK-7SBU

আশাকরি এটা সাহায্য করবে!


2
স্ট্যাক ওভারফ্লোতে স্বাগতম! যতক্ষণ এই তাত্ত্বিক প্রশ্নের উত্তর হতে পারে, এটা বাঞ্ছনীয় হবে উত্তর অপরিহার্য অংশের এখানে অন্তর্ভুক্ত করা, এবং রেফারেন্স এর জন্য লিঙ্ক প্রদান।
ঘোস্টটিক

1

যদি আমরা ইভেন্টের জায়গায় কেবল প্রতিনিধি ব্যবহার করি তবে গ্রাহকের কাছে চিত্রের নীচে প্রদর্শিত ডেলিগেট হিসাবে নিজেকে ক্লোন (), অনুরোধ করা () আহ্বান করার সুযোগ রয়েছে। যা সঠিক নয়।

এখানে চিত্র বর্ণনা লিখুন

এটিই মূল পার্থক্য b / w ইভেন্ট এবং প্রতিনিধি। গ্রাহকের একমাত্র অধিকার রয়েছে - ইভেন্টগুলি শুনছেন

কনসোললগ শ্রেণি ইভেন্ট ইভেন্টলগহ্যান্ডলারের মাধ্যমে লগ ইভেন্টগুলি সাবস্ক্রাইব করছে

public class ConsoleLog
{
    public ConsoleLog(Operation operation)
    {
        operation.EventLogHandler += print;
    }

    public void print(string str)
    {
        Console.WriteLine("write on console : " + str);
    }
}

ফাইললগ শ্রেণি ইভেন্ট ইভেন্টল্যান্ডহ্যান্ডলারের মাধ্যমে লগ ইভেন্টগুলি সাবস্ক্রাইব করছে

public class FileLog
{
    public FileLog(Operation operation)
    {
        operation.EventLogHandler += print;
    }

    public void print(string str)
    {
        Console.WriteLine("write in File : " + str);
    }
}

অপারেশন ক্লাস লগ ইভেন্ট প্রকাশ করছে

public delegate void logDelegate(string str);
public class Operation
{
    public event logDelegate EventLogHandler;
    public Operation()
    {
        new FileLog(this);
        new ConsoleLog(this);
    }

    public void DoWork()
    {
        EventLogHandler.Invoke("somthing is working");
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.