পার্থক্য বুঝতে আপনি এই 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();
পার্থক্য:
- আপনি কোনও সরকারী সম্পত্তি নয় বরং একটি সর্বজনীন ক্ষেত্র ব্যবহার করছেন না (ইভেন্টগুলির সাথে সংকলকটি আপনার ক্ষেত্রগুলি অযাচিত অ্যাক্সেস থেকে সুরক্ষা দেয়)
- ইভেন্টগুলি সরাসরি বরাদ্দ করা যায় না। এক্ষেত্রে আপনি আচরণটিকে ওভাররাইড করে আগের ত্রুটিটি করতে পারবেন না।
- আপনার শ্রেণীর বাইরের কেউ ইভেন্টটি তুলতে পারবেন না।
- ইভেন্টগুলি একটি ইন্টারফেস ঘোষণায় অন্তর্ভুক্ত করা যায়, যেখানে কোনও ক্ষেত্র পারে না
মন্তব্য
ইভেন্টহ্যান্ডলারকে নিম্নলিখিত প্রতিনিধি হিসাবে ঘোষণা করা হয়েছে:
public delegate void EventHandler (object sender, EventArgs e)
এটি প্রেরকের (অবজেক্ট টাইপের) এবং ইভেন্টের আর্গুমেন্টগুলিতে লাগে। প্রেরক যদি স্থির পদ্ধতি থেকে আসে তবে তা বাতিল হয়।
আপনি এর EventHAndler
পরিবর্তে এই উদাহরণটি ব্যবহার করতে পারেনEventHandler<ArgsSpecial>
পড়ুন এখানে EventHandler সম্পর্কে নথিপত্রের জন্য