সি # তে আপনার প্রতিনিধিদের ব্যবহার কী?
সি # তে আপনার প্রতিনিধিদের ব্যবহার কী?
উত্তর:
এখন যে আমাদের সি # তে ল্যাম্বদা এক্সপ্রেশন এবং বেনামী পদ্ধতি রয়েছে, আমি প্রতিনিধিদের আরও অনেক বেশি ব্যবহার করি। সি # 1 এ, যেখানে আপনার সর্বদা যুক্তিটি বাস্তবায়নের জন্য একটি পৃথক পদ্ধতি থাকতে হয়েছিল, সেখানে প্রতিনিধি ব্যবহার করা প্রায়শই বোঝায় না। আজকাল আমি এই জন্য প্রতিনিধিদের ব্যবহার করি:
প্রতিনিধিরা বিভিন্ন উদ্দেশ্যে অত্যন্ত কার্যকর।
এরকম একটি উদ্দেশ্য হ'ল ডেটা ফিল্টারিংয়ের ক্রমগুলির জন্য তাদের ব্যবহার করা। এই উদাহরণস্বরূপ আপনি এমন একটি ভবিষ্যদ্বাণীপূর্ণ প্রতিনিধি ব্যবহার করবেন যা একটি যুক্তি গ্রহণ করে এবং প্রতিনিধি নিজেই প্রয়োগের উপর নির্ভর করে সত্য বা মিথ্যা প্রত্যাবর্তন করে।
এখানে একটি নির্বোধ উদাহরণ - আমি নিশ্চিত যে আপনি এর থেকে আরও কার্যকর কিছু এক্সট্রোপোলেট করতে পারবেন:
using System;
using System.Linq;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<String> names = new List<String>
{
"Nicole Hare",
"Michael Hare",
"Joe Hare",
"Sammy Hare",
"George Washington",
};
// Here I am passing "inMyFamily" to the "Where" extension method
// on my List<String>. The C# compiler automatically creates
// a delegate instance for me.
IEnumerable<String> myFamily = names.Where(inMyFamily);
foreach (String name in myFamily)
Console.WriteLine(name);
}
static Boolean inMyFamily(String name)
{
return name.EndsWith("Hare");
}
}
static Boolean inMyFamily(String name)
পদ্ধতি প্রতিনিধি নেই। যেখানে প্যারামিটার হিসাবে একটি প্রতিনিধি লাগে। প্রতিনিধিরা যেহেতু কেবল ফাংশন পয়েন্টার যখন আপনি মেথডের নামটি এতে প্রবেশ করেন .Where(delegate)
তেমনি ডেলিগেট হয়। যেহেতু ইনমাইফ্যামিলি কোনও বুলিয়ান টাইপ দেয় এটি আসলে একটি শিকারী হিসাবে বিবেচিত হয়। পূর্বাভাসগুলি কেবল প্রতিনিধি যারা বুলিয়ানগুলি ফেরত দেয়।
আরও একটি আকর্ষণীয় উত্তর পেয়েছি:
একজন সহকর্মী আমাকে কেবল এই প্রশ্নটি জিজ্ঞাসা করেছিলেন -। নেট মধ্যে প্রতিনিধিদের কী লাভ? আমার উত্তরটি খুব সংক্ষিপ্ত এবং একটি যা সে অনলাইনে খুঁজে পায়নি: কোনও পদ্ধতির কার্যকর করতে বিলম্ব করার জন্য।
উৎস: লসটেকিজ
ঠিক যেমন লিনকুই করছে।
ফাংশন-টাইপড ভেরিয়েবল এবং পরামিতিগুলি ঘোষণার জন্য আপনি প্রতিনিধিদের ব্যবহার করতে পারেন।
উদাহরণ
"সম্পদ orrowণ গ্রহণ" প্যাটার্নটি বিবেচনা করুন। ক্লায়েন্ট কোডটি রিসোর্সটির মাঝে "ধার" নিতে দেওয়ার সময় আপনি কোনও সংস্থান তৈরি এবং পরিষ্কারকরণ নিয়ন্ত্রণ করতে চান।
এটি একটি প্রতিনিধি প্রকার ঘোষণা করে।
public delegate void DataReaderUser( System.Data.IDataReader dataReader );
এই স্বাক্ষরের সাথে মেলে এমন যে কোনও পদ্ধতি এই ধরণের কোনও প্রতিনিধিকে তাত্ক্ষণিকভাবে ব্যবহার করতে ব্যবহার করা যেতে পারে। সি # 2.0 তে, কেবল পদ্ধতিটির নাম ব্যবহারের পাশাপাশি অনামী পদ্ধতি ব্যবহার করে এটি স্পষ্টভাবে করা যেতে পারে।
এই পদ্ধতিটি পরামিতি হিসাবে প্রকারটি ব্যবহার করে। ডেলিগেটের অনুরোধ নোট করুন।
public class DataProvider
{
protected string _connectionString;
public DataProvider( string psConnectionString )
{
_connectionString = psConnectionString;
}
public void UseReader( string psSELECT, DataReaderUser readerUser )
{
using ( SqlConnection connection = new SqlConnection( _connectionString ) )
try
{
SqlCommand command = new SqlCommand( psSELECT, connection );
connection.Open();
SqlDataReader reader = command.ExecuteReader();
while ( reader.Read() )
readerUser( reader ); // the delegate is invoked
}
catch ( System.Exception ex )
{
// handle exception
throw ex;
}
}
}
ফাংশনটি নিম্নলিখিত হিসাবে একটি বেনাম পদ্ধতিতে কল করা যেতে পারে। নোট করুন যে বেনামে পদ্ধতিটি নিজের বাইরে ঘোষিত ভেরিয়েবলগুলি ব্যবহার করতে পারে । এটি অত্যন্ত কার্যকর (যদিও উদাহরণটি কিছুটা স্বীকৃত)।
string sTableName = "test";
string sQuery = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='" + sTableName + "'";
DataProvider.UseReader( sQuery,
delegate( System.Data.IDataReader reader )
{
Console.WriteLine( sTableName + "." + reader[0] );
} );
প্রতিনিধিদের প্রায়শই একটি পদ্ধতির সাথে ইন্টারফেসের জায়গায় ব্যবহার করা যেতে পারে, এর একটি সাধারণ উদাহরণ হবে পর্যবেক্ষক প্যাটার্ন। অন্য ভাষাগুলিতে আপনি যদি কোনও বিজ্ঞপ্তি পেতে চান যে কোনও কিছু ঘটেছে আপনি এর মতো সংজ্ঞা দিতে পারেন:
class IObserver{ void Notify(...); }
সি # তে এটি ইভেন্টগুলির ব্যবহার করে আরও প্রকাশিত হয় যেখানে হ্যান্ডলারটি একটি প্রতিনিধি, উদাহরণস্বরূপ:
myObject.SomeEvent += delegate{ Console.WriteLine("..."); };
প্রতিনিধিদের ব্যবহারের জন্য আর একটি দুর্দান্ত জায়গা যদি আপনাকে কোনও ফাংশনে প্রিকিকেট দিতে হয়, উদাহরণস্বরূপ তালিকা থেকে আইটেমের সেট নির্বাচন করার সময়:
myList.Where(i => i > 10);
উপরেরটি ল্যাম্বদা সিনট্যাক্সের উদাহরণ, যা নীচেও লেখা যেতে পারত:
myList.Where(delegate(int i){ return i > 10; });
প্রতিনিধিদের ব্যবহারে এটি কার্যকর হতে পারে এমন আরও একটি জায়গা হ'ল কারখানার ফাংশনগুলি রেজিস্ট্রেশন করা, উদাহরণস্বরূপ:
myFactory.RegisterFactory(Widgets.Foo, () => new FooWidget());
var widget = myFactory.BuildWidget(Widgets.Foo);
আশা করি এটা কাজে লাগবে!
আমি এই সত্যিই দেরিতে আসছি তবে আজ আমি প্রতিনিধিদের উদ্দেশ্যটি নির্ধারণ করতে সমস্যা হচ্ছিলাম এবং দুটি সহজ প্রোগ্রাম লিখেছিলাম যা একই ফলাফল দেয় যা আমি মনে করি তাদের উদ্দেশ্যটি ভালভাবে ব্যাখ্যা করেছে।
NoDelegates.cs
using System;
public class Test {
public const int MAX_VALUE = 255;
public const int MIN_VALUE = 10;
public static void checkInt(int a) {
Console.Write("checkInt result of {0}: ", a);
if (a < MAX_VALUE && a > MIN_VALUE)
Console.WriteLine("max and min value is valid");
else
Console.WriteLine("max and min value is not valid");
}
public static void checkMax(int a) {
Console.Write("checkMax result of {0}: ", a);
if (a < MAX_VALUE)
Console.WriteLine("max value is valid");
else
Console.WriteLine("max value is not valid");
}
public static void checkMin(int a) {
Console.Write("checkMin result of {0}: ", a);
if (a > MIN_VALUE)
Console.WriteLine("min value is valid");
else
Console.WriteLine("min value is not valid");
Console.WriteLine("");
}
}
public class Driver {
public static void Main(string [] args) {
Test.checkInt(1);
Test.checkMax(1);
Test.checkMin(1);
Test.checkInt(10);
Test.checkMax(10);
Test.checkMin(10);
Test.checkInt(20);
Test.checkMax(20);
Test.checkMin(20);
Test.checkInt(30);
Test.checkMax(30);
Test.checkMin(30);
Test.checkInt(254);
Test.checkMax(254);
Test.checkMin(254);
Test.checkInt(255);
Test.checkMax(255);
Test.checkMin(255);
Test.checkInt(256);
Test.checkMax(256);
Test.checkMin(256);
}
}
Delegates.cs
using System;
public delegate void Valid(int a);
public class Test {
public const int MAX_VALUE = 255;
public const int MIN_VALUE = 10;
public static void checkInt(int a) {
Console.Write("checkInt result of {0}: ", a);
if (a < MAX_VALUE && a > MIN_VALUE)
Console.WriteLine("max and min value is valid");
else
Console.WriteLine("max and min value is not valid");
}
public static void checkMax(int a) {
Console.Write("checkMax result of {0}: ", a);
if (a < MAX_VALUE)
Console.WriteLine("max value is valid");
else
Console.WriteLine("max value is not valid");
}
public static void checkMin(int a) {
Console.Write("checkMin result of {0}: ", a);
if (a > MIN_VALUE)
Console.WriteLine("min value is valid");
else
Console.WriteLine("min value is not valid");
Console.WriteLine("");
}
}
public class Driver {
public static void Main(string [] args) {
Valid v1 = new Valid(Test.checkInt);
v1 += new Valid(Test.checkMax);
v1 += new Valid(Test.checkMin);
v1(1);
v1(10);
v1(20);
v1(30);
v1(254);
v1(255);
v1(256);
}
}
কিছুটা আলাদা ব্যবহার প্রতিবিম্বকে গতিময় করা; অর্থাত্ প্রতিবার প্রতিবিম্বটি ব্যবহার Delegate.CreateDelegate
না করে আপনি কোনও পদ্ধতিতে (ক MethodInfo
) একটি (টাইপড) প্রতিনিধি তৈরি করতে এবং তার পরিবর্তে সেই প্রতিনিধিকে কল করতে পারেন। এটি তখন অনেক বেশি হিসাবে চেক ইতিমধ্যে সম্পন্ন করা হয়েছে, কলের জন্য প্রতি দ্রুততর।
এর সাথে Expression
, আপনি ফ্লাইতে কোড তৈরি করতেও একই কাজটি করতে পারেন - উদাহরণস্বরূপ, আপনি সহজেই এমন একটি তৈরি করতে পারেন Expression
যা রানটাইমের সময় বেছে নেওয়া একটি প্রকারের জন্য + অপারেটরকে উপস্থাপন করে (জেনেরিকদের জন্য অপারেটর সমর্থন সরবরাহ করতে, যা ভাষা সরবরাহ করে না) ; এবং আপনি Expression
একটি টাইপ করা প্রতিনিধি - কাজ সম্পন্ন করতে একটি সংকলন করতে পারেন ।
আপনি ইভেন্টগুলি ব্যবহার করার সময় প্রতিনিধিরা ব্যবহার করা হয় - এটি সেই প্রক্রিয়া যার দ্বারা তারা কাজ করে।
তদ্ব্যতীত, প্রতিনিধিরা লিনকিউ ক্যোয়ারী ব্যবহার করার মতো জিনিসের জন্য খুব দরকারী। উদাহরণস্বরূপ, অনেকগুলি লিনকুই ক্যোয়ারী একটি প্রতিনিধি নেয় (প্রায়শই Func<T,TResult>
) যা ফিল্টারিংয়ের জন্য ব্যবহার করা যেতে পারে।
উদাহরণ হিসাবে এখানে দেখা যেতে পারে । আপনার নির্দিষ্ট কিছু প্রয়োজনীয়তা পূরণ করে এমন একটি বস্তুর প্রক্রিয়া করার একটি পদ্ধতি রয়েছে। তবে আপনি একাধিক উপায়ে অবজেক্টটি প্রক্রিয়া করতে সক্ষম হতে চান। পৃথক পদ্ধতি তৈরি করার পরিবর্তে, আপনি কেবল একটি ম্যাচিং পদ্ধতি নির্ধারণ করতে পারেন যা কোনও প্রতিনিধিকে উদ্দেশ্য করে প্রসেসটি প্রেরণ করে এবং প্রতিনিধিদের সেই পদ্ধতিতে প্রেরণ করে যা বস্তু নির্বাচন করে। এইভাবে, আপনি এক নির্বাচক পদ্ধতিতে বিভিন্ন পদ্ধতি নির্ধারণ করতে পারেন। আমি এটিকে সহজেই বোধগম্য করার চেষ্টা করেছি।
আমি থ্রেডগুলির সাথে যোগাযোগের জন্য প্রতিনিধিদের ব্যবহার করি।
উদাহরণস্বরূপ, আমার কাছে একটি জয় ফর্ম অ্যাপ থাকতে পারে যা কোনও ফাইল ডাউনলোড করে। অ্যাপ্লিকেশনটি ডাউনলোড করার জন্য একটি কর্মী থ্রেড শুরু করে (যা জিইআইআইকে লক করা থেকে বাধা দেয়)। শ্রমিক থ্রেড প্রতিনিধিদের ব্যবহার করে স্থিতি বার্তা প্রেরণ করতে (যেমন ডাউনলোডের অগ্রগতি) মূল প্রোগ্রামে ফিরে আসে, যাতে জিইউআই স্ট্যাটাস বারটি আপডেট করতে পারে।
ইভেন্ট হ্যান্ডলার জন্য
একটি পদ্ধতি পরামিতি মধ্যে পদ্ধতি পাস
ইভেন্টগুলি, অন্য যে কোনও ক্রিয়াকলাপ
যে কোনও সময় আপনি আচরণকে সজ্জিত করতে চান, তবে এটি অভিন্ন পদ্ধতিতে প্রার্থনা করুন। ইভেন্ট হ্যান্ডলারগুলি, কল-ব্যাক ফাংশন ইত্যাদি You আপনি ইন্টারফেস এবং ক্যাসেট ব্যবহার করে অনুরূপ জিনিসগুলি সম্পাদন করতে পারেন তবে কখনও কখনও আচরণটি কোনও প্রকার বা বস্তুর সাথে আবশ্যকভাবে আবদ্ধ হয় না । কখনও কখনও আপনার কেবল এমন আচরণ করা উচিত যা আপনাকে encapsulate করা প্রয়োজন।
অলস প্যারামিটার সূচনা! পূর্ববর্তী সমস্ত উত্তর (কৌশল প্যাটার্ন, পর্যবেক্ষক প্যাটার্ন, ইত্যাদি) ছাড়াও প্রতিনিধিরা আপনাকে পরামিতিগুলির অলস সূচনা পরিচালনা করতে অনুমতি দেয়। উদাহরণস্বরূপ, ধরুন আপনার একটি ডাউনলোড () ফাংশন রয়েছে যা বেশ সময় নেয় এবং একটি নির্দিষ্ট ডাউনলোডডবজেক্ট ফেরত দেয়। এই শর্তটি নির্দিষ্ট অবস্থার উপর নির্ভর করে স্টোরেজ দ্বারা গ্রাস করা হয়। সাধারণত, আপনি:
storage.Store(conditions, Download(item))
তবে, প্রতিনিধিদের সাথে (আরও সুনির্দিষ্টভাবে, ল্যাম্বডাস) স্টোরের স্বাক্ষর পরিবর্তন করে আপনি নিম্নলিখিতটি করতে পারেন যাতে এটি একটি শর্ত এবং একটি ফানক <আইটেম, ডাউনলোডডোবজেক্ট> পান এবং এটি এটি ব্যবহার করুন:
storage.Store(conditions, (item) => Download(item))
অতএব, স্টোরেজ শুধুমাত্র শর্তগুলির উপর নির্ভর করে ডাউনলোড চালানো, প্রয়োজনে প্রতিনিধিকে মূল্যায়ন করবে।
প্রতিনিধিদের ব্যবহার
ইন অ্যারেতে তুলনা প্যারাম।
প্রতিনিধি এর রেফারেন্স দ্বারা একটি পদ্ধতি কল করতে ব্যবহৃত হয়। উদাহরণ স্বরূপ:
delegate void del_(int no1,int no2);
class Math
{
public static void add(int x,int y)
{
Console.WriteLine(x+y);
}
public static void sub(int x,int y)
{
Console.WriteLine(x-y);
}
}
class Program
{
static void Main(string[] args)
{
del_ d1 = new del_(Math.add);
d1(10, 20);
del_ d2 = new del_(Math.sub);
d2(20, 10);
Console.ReadKey();
}
}