আমি বুঝতে পারি যে এই প্রশ্নটি 10 বছরেরও বেশি পুরানো, তবে এটি আমার কাছে উপস্থিত হয়েছে যে কেবল সর্বাধিক সুস্পষ্ট উত্তরই সম্বোধন করা হয়নি, তবে এটি সম্ভবত প্রশ্নটি থেকে পরিষ্কার নয় যে প্রচ্ছদের অধীনে কী চলছে তার একটি ভাল বোঝাপড়া। এছাড়াও, দেরীতে বাইন্ডিং এবং ডেলিগেটস এবং ল্যাম্বডাসের ক্ষেত্রে এর অর্থ কী তা সম্পর্কে আরও প্রশ্ন রয়েছে (পরে আরও) more
প্রথমে ঘরে 800 পাউন্ডের হাতি / গরিলা সম্বোধন করুন, কখন eventবনাম Action<T>/ Func<T>:
- একটি বিবৃতি বা পদ্ধতি কার্যকর করতে একটি ল্যাম্বডা ব্যবহার করুন। ব্যবহার করুন
eventযখন আপনি একাধিক বিবৃতি / lambdas / ফাংশন সঙ্গে একটি প্রকা / সদ মডেল যে চালানো হবে আরো চাই (এটি হল প্রধান
এটি ব্যাটের ডানদিকে পার্থক্য) ।
- আপনি যখন অভিব্যক্তি গাছগুলিতে বিবৃতি / ফাংশনগুলি সংকলন করতে চান তখন ল্যাম্বডা ব্যবহার করুন। আপনি যখন আরও বেশি traditionalতিহ্যবাহী দেরী বাইন্ডিং যেমন প্রতিচ্ছবি এবং সিওএম আন্তঃবিদ্যায় ব্যবহৃত হিসাবে অংশ নিতে চান তখন প্রতিনিধি / ইভেন্টগুলি ব্যবহার করুন।
কোনও ইভেন্টের উদাহরণ হিসাবে, একটি ছোট কনসোল অ্যাপ্লিকেশন ব্যবহার করে ইভেন্টগুলির একটি সহজ এবং 'স্ট্যান্ডার্ড' সেটটিকে তারের আপ করতে দিন:
public delegate void FireEvent(int num);
public delegate void FireNiceEvent(object sender, SomeStandardArgs args);
public class SomeStandardArgs : EventArgs
{
public SomeStandardArgs(string id)
{
ID = id;
}
public string ID { get; set; }
}
class Program
{
public static event FireEvent OnFireEvent;
public static event FireNiceEvent OnFireNiceEvent;
static void Main(string[] args)
{
OnFireEvent += SomeSimpleEvent1;
OnFireEvent += SomeSimpleEvent2;
OnFireNiceEvent += SomeStandardEvent1;
OnFireNiceEvent += SomeStandardEvent2;
Console.WriteLine("Firing events.....");
OnFireEvent?.Invoke(3);
OnFireNiceEvent?.Invoke(null, new SomeStandardArgs("Fred"));
//Console.WriteLine($"{HeightSensorTypes.Keyence_IL030}:{(int)HeightSensorTypes.Keyence_IL030}");
Console.ReadLine();
}
private static void SomeSimpleEvent1(int num)
{
Console.WriteLine($"{nameof(SomeSimpleEvent1)}:{num}");
}
private static void SomeSimpleEvent2(int num)
{
Console.WriteLine($"{nameof(SomeSimpleEvent2)}:{num}");
}
private static void SomeStandardEvent1(object sender, SomeStandardArgs args)
{
Console.WriteLine($"{nameof(SomeStandardEvent1)}:{args.ID}");
}
private static void SomeStandardEvent2(object sender, SomeStandardArgs args)
{
Console.WriteLine($"{nameof(SomeStandardEvent2)}:{args.ID}");
}
}
আউটপুট নীচের মত দেখতে হবে:

Action<int>বা এর সাথে যদি আপনি একই করেন তবে Action<object, SomeStandardArgs>আপনি কেবল দেখতে পাবেন SomeSimpleEvent2এবংSomeStandardEvent2 ।
ভিতরে কি চলছে event ?
যদি আমরা প্রসারিত করি FireNiceEvent, সংকলকটি আসলে নিম্নলিখিতটি তৈরি করছে (থ্রেড সিঙ্ক্রোনাইজেশনের ক্ষেত্রে আমি কিছু বিশদ বাদ দিয়েছি যা এই আলোচনার সাথে প্রাসঙ্গিক নয়):
private EventHandler<SomeStandardArgs> _OnFireNiceEvent;
public void add_OnFireNiceEvent(EventHandler<SomeStandardArgs> handler)
{
Delegate.Combine(_OnFireNiceEvent, handler);
}
public void remove_OnFireNiceEvent(EventHandler<SomeStandardArgs> handler)
{
Delegate.Remove(_OnFireNiceEvent, handler);
}
public event EventHandler<SomeStandardArgs> OnFireNiceEvent
{
add
{
add_OnFireNiceEvent(value)
}
remove
{
remove_OnFireNiceEvent(value)
}
}
সংকলকটি একটি প্রাইভেট ডেলিগেট ভেরিয়েবল উত্পন্ন করে যা শ্রেণীর নেমস্পেসের মধ্যে দৃশ্যমান নয় যেখানে এটি উত্পন্ন হয়। এই প্রতিনিধিটি হ'ল সাবস্ক্রিপশন পরিচালনা এবং দেরীতে বাধ্যতামূলক অংশগ্রহণের জন্য যা ব্যবহৃত হয় এবং জনসাধারণের মুখোমুখি ইন্টারফেসটি আমাদের পরিচিত +=এবং -=অপারেটররা সবাই জানতে পেরেছিলেন এবং ভালোবাসেন:)
এর স্কোপটি পরিবর্তন করে আপনি অ্যাড / রিমুভাল হ্যান্ডলারের কোডটি কাস্টমাইজ করতে পারেন FireNiceEvent সুরক্ষিত । এটি এখন বিকাশকারীদের লগিং বা সুরক্ষা হুকের মতো হুকগুলিতে কাস্টম হুক যুক্ত করতে দেয়। এটি সত্যিই এমন বেশ কয়েকটি শক্তিশালী বৈশিষ্ট্য তৈরি করে যা ব্যবহারকারীর ভূমিকা ইত্যাদির উপর ভিত্তি করে সাবস্ক্রিপশনটিতে কাস্টমাইজড অ্যাক্সেসযোগ্যতার অনুমতি দেয় আপনি ল্যাম্বডাস দিয়ে এটি করতে পারেন? (প্রকৃতপক্ষে আপনি কাস্টমাইজেশন এক্সপ্রেশন ট্রিগুলি দ্বারা করতে পারেন, তবে এটি এই প্রতিক্রিয়াটির পরিধি ছাড়িয়ে গেছে)।
এখানে কিছু প্রতিক্রিয়া থেকে কয়েকটি পয়েন্ট সম্বোধন করতে:
আরগস তালিকা Action<T>পরিবর্তন করে এবং প্রাপ্ত ক্লাসে বৈশিষ্ট্যগুলি পরিবর্তনের মধ্যে 'ভঙ্গুরতা' তেমন কোনও পার্থক্য নেই EventArgs। হয় কেবল একটি সংকলন পরিবর্তন প্রয়োজন হবে না, তারা উভয় একটি পাবলিক ইন্টারফেস পরিবর্তন হবে এবং সংস্করণ প্রয়োজন হবে। কোনও পার্থক্য নেই।
একটি শিল্পের মান যা সম্মানের সাথে এটি নির্ভর করে যে এটি কোথায় ব্যবহৃত হচ্ছে এবং কেন। Action<T>এবং এগুলি প্রায়শই আইওসি এবং ডিআইতে ব্যবহৃত হয় এবং eventপ্রায়শই জিইউআই এবং এমকিউ টাইপ ফ্রেমওয়ার্ক হিসাবে বার্তা রাউটিংয়ে ব্যবহৃত হয়। নোট করুন যে আমি প্রায়শই বলেছি , সবসময় না ।
প্রতিনিধিদের ল্যাম্বডাসের চেয়ে আলাদা জীবনকাল থাকে। একজনকে ক্যাপচার সম্পর্কেও সচেতন হতে হবে ... কেবল বন্ধের সাথে নয়, 'বিড়াল কী টানছিল তা দেখুন' এর ধারণার সাথেও। এটি মেমরির পদচিহ্ন / আজীবন পাশাপাশি পরিচালনা ওরফে ফাঁসকে প্রভাবিত করে।
আরও একটি জিনিস, আমি আগে উল্লেখ করেছি এমন কিছু জিনিস ... দেরীতে বাইন্ডিংয়ের ধারণা। লম্বা যখন 'লাইভ' হয়ে যায় তখন লিনকির মতো কাঠামো ব্যবহার করার সময় আপনি প্রায়শই এটি দেখতে পাবেন। এটি কোনও প্রতিনিধিকে দেরীতে আবদ্ধ করার চেয়ে খুব আলাদা, যা একাধিকবার ঘটতে পারে (যেমন ল্যাম্বডা সর্বদা উপস্থিত থাকে, তবে বাঁধাগুলি চাহিদা অনুযায়ী যতবার প্রয়োজন ততক্ষণে ঘটে), ল্যাম্বদার বিপরীতে, যা একবার হয়ে গেলে এটি হয়ে যায় done - যাদুটি চলে গেছে, এবং পদ্ধতি (গুলি) / সম্পত্তি (আইস) সর্বদা আবদ্ধ থাকবে। কিছু মনে রাখবেন।