প্রতিনিধিরা: প্রিডিকেট বনাম অ্যাকশন বনাম ফুনক


137

কেউ কি এই 3 অতি গুরুত্বপূর্ণ প্রতিনিধিদের একটি ভাল ব্যাখ্যা (আশা সঙ্গে উদাহরণ সহ) সরবরাহ করতে পারেন:

  • সূত্রের বিধেয়
  • কর্ম
  • func

উত্তর:


180
  • Predicate: মূলত Func<T, bool>; প্রশ্ন জিজ্ঞাসা করে "নির্দিষ্ট যুক্তি প্রতিনিধি দ্বারা প্রতিনিধিত্ব করা শর্তটি কি পূরণ করে?" List.FindAll এর মতো জিনিসগুলিতে ব্যবহৃত হয়।

  • Action: যুক্তি দিয়ে একটি ক্রিয়া সম্পাদন করুন। খুব সাধারণ উদ্দেশ্য। এটি লিনকু তে খুব বেশি ব্যবহৃত হয় না কারণ এটি মূলত পার্শ্ব-প্রতিক্রিয়াগুলিকে বোঝায়।

  • Func: লিনকিউতে ব্যাপকভাবে ব্যবহৃত হয় , সাধারণত আর্গুমেন্টকে রূপান্তর করতে, উদাহরণস্বরূপ একটি সম্পত্তিতে একটি জটিল কাঠামো প্রজেক্ট করে।

অন্যান্য গুরুত্বপূর্ণ প্রতিনিধি:

  • EventHandler/ EventHandler<T>: সমস্ত উইনফোর্মে ব্যবহৃত হয়

  • Comparison<T>: লাইক IComparer<T>কিন্তু ডেলিগেট ফর্মে।


3
এছাড়াও আছে System.Converter<TInput, TOutput>, যদিও এটা খুব কমই ব্যবহৃত হচ্ছে।
জি-উইজ

4
রূপান্তরকারীটি একটি দুর্দান্ত প্রতিনিধি হয় যখন প্রচুর মডেলকে ব্যবসায়িক ক্লাসে রূপান্তরিত করা প্রয়োজন, যেমন স্টাম.ডে
মাইকেল স্টাম

EventHandler/EventHandler<T>উইনফরমের বাইরেও দেখা যায়।
অ্যান্ডি

@ অ্যান্ডি: কিছুটা ... তবে উদাহরণস্বরূপ ডাব্লুপিএফ-তে কম। আমি সম্মত হই যে এতে উইনফোর্ডস-নির্দিষ্ট কিছু নেই।
জন স্কিটি

48

Action, Funcএবং Predicateসমস্ত প্রতিনিধি পরিবারের অন্তর্ভুক্ত।

Action : ক্রিয়াটি এন ইনপুট পরামিতি নিতে পারে তবে এটি শূন্য হয়।

Func: ফানক এন ইনপুট প্যারামিটার নিতে পারে তবে এটি সর্বদা প্রদত্ত ধরণের ফলাফল প্রদান করবে। Func<T1,T2,T3,TResult>এখানে টি 1, টি 2, টি 3 হ'ল ইনপুট পরামিতি এবং ট্রিসল্ট এটির আউটপুট।

Predicate: ভবিষ্যদ্বাণীত এছাড়াও ফানকের একটি ফর্ম তবে এটি সর্বদা বুল ফিরে আসবে। সহজ কথায় এটি মোড়ক Func<T,bool>


এই প্রশ্নের সাথে আমি সবচেয়ে ভাল এবং সহজ উত্তর খুঁজে পেয়েছি
রেয়ান চৌগল

@ রেয়ানচাগল: খুশী, আপনি এটি সহায়ক বলে মনে করেন।
রাহুল গার্গ

9

জনের উত্তর ছাড়াও, রয়েছে

  • Converter<TInput, TOutput>: এটি মূলত Func<TInput, TOutput>, তবে শব্দার্থবিজ্ঞানের সাথে। তালিকা.কনভার্টএল এবং অ্যারে। কনভার্টএল দ্বারা ব্যবহৃত, কিন্তু ব্যক্তিগতভাবে এটি অন্য কোথাও দেখেনি।

4

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

myForm.BeginInvoke((MethodInvoker)delegate
{
  MessageBox.Show("Hello, world...");
});

আমি থ্রেডস্টার্ট এবং প্যারামিটারাইজড থ্রেডস্টার্ট সম্পর্কে সচেতন থাকব; আজকাল বেশিরভাগ লোকেরা কোনও অ্যাকশনের বিকল্প নেবে।


3

প্রিডিকেট, ফানক এবং অ্যাকশন হ'ল। নেট এর অন্তর্নিহিত প্রতিনিধিদের উদাহরণ। এই প্রতিনিধিদের প্রতিটি উদাহরণ নির্দিষ্ট স্বাক্ষর সহ ব্যবহারকারী পদ্ধতিগুলিকে উল্লেখ করতে বা নির্দেশ করতে পারে।

অ্যাকশন প্রতিনিধি - অ্যাকশন প্রতিনিধি উদাহরণগুলি এমন পদ্ধতিগুলির দিকে ইঙ্গিত করতে পারে যা আর্গুমেন্ট গ্রহণ করে এবং বাতিল বাতিল করে।

ফানক প্রতিনিধি - ফানক প্রতিনিধি উদাহরণ পদ্ধতি (গুলি )গুলিতে নির্দেশ করতে পারে যা পরিবর্তনশীল সংখ্যক আর্গুমেন্ট গ্রহণ করে এবং কোনও প্রকার ফেরত দেয়।

ভবিষ্যদ্বাণী - ভবিষ্যদ্বাণীগুলি ফান ডেলিগেটের উদাহরণগুলির মতো এবং তারা এমন পদ্ধতিগুলির দিকে ইঙ্গিত করতে পারে যা পরিবর্তনশীল সংখ্যক আর্গুমেন্ট গ্রহণ করে এবং একটি বিলের প্রকার ফেরত দেয়।


2

ল্যাম্বদা সহ অ্যাকশন এবং ফানক:

person p = new person();
Action<int, int> mydel = p.add;       /*(int a, int b) => { Console.WriteLine(a + b); };*/
Func<string, string> mydel1 = p.conc; /*(string s) => { return "hello" + s; };*/
mydel(2, 3);
string s1=  mydel1(" Akhil");
Console.WriteLine(s1);
Console.ReadLine();

2

ফানক আরও লিনকিউ বন্ধুত্বপূর্ণ, একটি প্যারামিটার হিসাবে পাস হতে পারে। (পয়েন্ট-বিনামূল্যে)

ভবিষ্যদ্বাণী করতে পারে না, আবার জড়িয়ে রাখতে হবে।

Predicate<int> IsPositivePred = i => i > 0;
Func<int,bool> IsPositiveFunc = i => i > 0;

new []{2,-4}.Where(i=>IsPositivePred(i)); //Wrap again

new []{2,-4}.Where(IsPositivePred);  //Compile Error
new []{2,-4}.Where(IsPositiveFunc);  //Func as Parameter

2

আর্গুমেন্টগুলি এবং প্রতিটি ধরণের কী পুনরুদ্ধার করা যায় সে সম্পর্কে একটি সাধারণ উদাহরণ

এই ফানক দুটি আন্তঃ যুক্তি গ্রহণ করে একটি পূর্বাবস্থায় ফেরত দেয় un ফানকের সর্বদা রিটার্নের ধরণ থাকে

 Func<int, int, int> sum = (a, b) => a + b;
 Console.WriteLine(sum(3, 5));//Print 8

এক্ষেত্রে ফানকের আর্গুমেন্ট নেই তবে স্ট্রিংটি ফিরে আসে

Func<string> print = () => "Hello world";
Console.WriteLine(print());//Print Hello world

এই ক্রিয়াটি দুটি আন্তঃ যুক্তি গ্রহণ করে এবং বাতিল বাতিল করে v

Action<int, int> displayInput = (x, y) => Console.WriteLine("First number is :" + x + " , Second number is "+ y);
displayInput(4, 6); //Print First number is :4 , Second number is :6

এই ভবিষ্যদ্বাণীটি একটি যুক্তি গ্রহণ করে এবং সর্বদা বুল ফেরত দেয় ene

Predicate<int> isPositive = (x) => x > 0;
Console.WriteLine(isPositive(5));//Print True
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.