উত্তর:
dynamic
শব্দ ভেরিয়েবল প্রয়াত-বাউন্ড করা উচিত ডিক্লেয়ার করতে ব্যবহৃত হয়।
যদি আপনি কোনও আসল বা কল্পনাযুক্ত ধরণের জন্য দেরীতে বাইন্ডিং ব্যবহার করতে চান তবে আপনি dynamic
কীওয়ার্ডটি ব্যবহার করেন এবং বাকীটি সংকলকটি করেন।
আপনি যখন dynamic
কোনও সাধারণ উদাহরণের সাথে ইন্টারঅ্যাক্ট করার জন্য কীওয়ার্ডটি ব্যবহার করেন , তখন ডিএলআর দৃষ্টান্তের স্বাভাবিক পদ্ধতিগুলিতে দেরিতে আবদ্ধ কলগুলি করে।
IDynamicMetaObjectProvider
ইন্টারফেস একটি বর্গ তার দেরী আবদ্ধ আচরণ নিয়ন্ত্রণ নিতে পারেন।
আপনি যখন প্রয়োগটির dynamic
সাথে ইন্টারঅ্যাক্ট করার জন্য কীওয়ার্ডটি ব্যবহার করেন IDynamicMetaObjectProvider
, তখন ডিএলআর IDynamicMetaObjectProvider
পদ্ধতিগুলিকে কল করে এবং অবজেক্টটি নিজেই সিদ্ধান্ত নেবে যে কী করা উচিত।
ExpandoObject
এবং DynamicObject
ক্লাস বাস্তবায়নের হয় IDynamicMetaObjectProvider
।
ExpandoObject
একটি সাধারণ বর্গ যা আপনাকে একটি দৃষ্টান্তে সদস্য যুক্ত করতে এবং তাদের dynamic
মিত্রতাকে ব্যবহার করার অনুমতি দেয় ।
DynamicObject
এটি একটি আরও উন্নত বাস্তবায়ন যা সহজেই স্বনির্ধারিত আচরণ প্রদানের জন্য উত্তরাধিকারসূত্রে প্রাপ্ত হতে পারে।
গতিশীল ExpandoObject
এবং এর মধ্যে পার্থক্য কী তা পরিষ্কার করে বোঝাতে আমি এই প্রশ্নের একটি পরিষ্কার উত্তর দেওয়ার চেষ্টা করব DynamicObject
।
খুব দ্রুত, dynamic
একটি কীওয়ার্ড। এটি প্রতি-সেয়ে টাইপ নয়। এটি এমন একটি কীওয়ার্ড যা সংকলককে ডিজাইনের সময় স্থির ধরণের চেক উপেক্ষা করতে এবং পরিবর্তে রান-টাইমে দেরি-বাঁধাই ব্যবহার করতে বলে। সুতরাং আমরা dynamic
এই উত্তরটির বাকি অংশে খুব বেশি সময় ব্যয় করব না ।
ExpandoObject
এবং DynamicObject
প্রকৃতপক্ষে প্রকার। সারফেসে, তারা একে অপরের সাথে খুব মিল দেখায়। উভয় শ্রেণি বাস্তবায়ন করে IDynamicMetaObjectProvider
। যাইহোক, আরও গভীর খনন করুন এবং আপনি দেখতে পাবেন যে এগুলি মোটেও একই রকম নয়।
ডায়নামিকবজেক্ট হ'ল আংশিক বাস্তবায়ন হ'ল IDynamicMetaObjectProvider
বিকাশকারীদের নিজস্ব কাস্টম ধরণের গতিশীল প্রেরণাকে কাস্টম আন্ডারলাইং স্টোরেজ এবং গতিশীল প্রেরণের কাজটি করার জন্য পুনরুদ্ধার আচরণের সাথে ডায়ামিক প্রেরণকে সমর্থন করে বাস্তবায়ন করার জন্য একটি আংশিক বাস্তবায়ন ।
সংক্ষেপে, আপনি যখন আপনার OWN ধরণের তৈরি করতে চান যা DLR এর সাথে ব্যবহার করা যায় এবং আপনার পছন্দসই CUSTOM আচরণের সাথে কাজ করতে চান তখন ডায়নামিকঅবজেক্টটি ব্যবহার করুন।
উদাহরণ: কল্পনা করুন যে আপনি এমন একটি ডায়নামিক টাইপ রাখতে চান যা যখনই উপস্থিত নেই এমন সদস্যের উপর যখন চেষ্টা করার চেষ্টা করা হয় তখনই তারা একটি কাস্টম ডিফল্ট ফিরিয়ে দেয় (অর্থাত্ চালুর সময় যোগ করা হয়নি)। এবং এটি ডিফল্ট বলবে, "আমি দুঃখিত, এই বয়ামে কোনও কুকিজ নেই!"! আপনি যদি এমন একটি গতিশীল অবজেক্ট চান যা এইরকম আচরণ করে, আপনি যখন ক্ষেত্র খুঁজে না পাওয়া যায় তখন কী হবে তা আপনাকে নিয়ন্ত্রণ করতে হবে। ExpandoObject আপনাকে এটি করতে দেবে না। সুতরাং আপনাকে অনন্য গতিশীল সদস্য রেজোলিউশন (প্রেরণ) আচরণের সাথে আপনার নিজস্ব ধরণের তৈরি করতে হবে এবং এটি তৈরির পরিবর্তে ব্যবহার করতে হবেExpandoObject
।
আপনি নিম্নরূপ একটি প্রকার তৈরি করতে পারেন: (দ্রষ্টব্য, নীচের কোডটি কেবল উদাহরণের জন্য এবং এটি চলতে পারে না D ডায়নামিকঅবজেক্টকে কীভাবে সঠিকভাবে ব্যবহার করতে হয় সে সম্পর্কে অন্যান্য কোথাও অনেক নিবন্ধ এবং টিউটোরিয়াল রয়েছে))
public class MyNoCookiesInTheJarDynamicObject : DynamicObject
{
Dictionary<string, object> properties = new Dictionary<string, object>();
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
if (properties.ContainsKey(binder.Name))
{
result = properties[binder.Name];
return true;
}
else
{
result = "I'm sorry, there are no cookies in this jar!"; //<-- THIS IS OUR
CUSTOM "NO COOKIES IN THE JAR" RESPONSE FROM OUR DYNAMIC TYPE WHEN AN UNKNOWN FIELD IS ACCESSED
return false;
}
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
properties[binder.Name] = value;
return true;
}
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
dynamic method = properties[binder.Name];
result = method(args[0].ToString(), args[1].ToString());
return true;
}
}
এখন, আমরা কেবলমাত্র একটি গতিশীল প্রকার হিসাবে তৈরি এই কল্পিত শ্রেণির ব্যবহার করতে পারি যা ক্ষেত্রটির অস্তিত্ব না থাকলে খুব কাস্টম আচরণ করে।
dynamic d = new MyNoCookiesInTheJarDynamicObject();
var s = d.FieldThatDoesntExist;
//in our contrived example, the below should evaluate to true
Assert.IsTrue(s == "I'm sorry, there are no cookies in this jar!")
ExpandoObject
IDynamicMetaObjectProvider
.NET ফ্রেমওয়ার্ক টিম আপনার জন্য এই সমস্ত সিদ্ধান্ত নিয়েছে এমন একটি সম্পূর্ণ বাস্তবায়ন । আপনার যদি কোনও কাস্টম আচরণের প্রয়োজন না হয় তবে এটি কার্যকর হয় এবং আপনি মনে করেন যে এক্সপান্ডোঅবজেক্ট আপনার জন্য যথেষ্ট ভাল কাজ করে (90% সময়, ExpandoObject
যথেষ্ট ভাল)। সুতরাং উদাহরণস্বরূপ, নিম্নলিখিতটি দেখুন এবং এটি এক্সপেন্ডোঅবজেক্টের জন্য, যদি গতিশীল সদস্যের অস্তিত্ব না থাকে তবে ডিজাইনাররা একটি ব্যতিক্রম ছুঁড়ে ফেলতে পছন্দ করে।
dynamic d = new ExpandoObject();
/*
The ExpandoObject designers chose that this operation should result in an
Exception. They did not have to make that choice, null could
have been returned, for example; or the designers could've returned a "sorry no cookies in the jar" response like in our custom class. However, if you choose to use
ExpandoObject, you have chosen to go with their particular implementation
of DynamicObject behavior.
*/
try {
var s = d.FieldThatDoesntExist;
}
catch(RuntimeBinderException) { ... }
সুতরাং সংক্ষেপে বলা যায়, ExpandoObject
ডায়নামিকবজেক্টকে নির্দিষ্ট গতিশীল প্রেরণের আচরণের সাথে প্রসারিত করার জন্য কেবল একটি প্রাক-বাছাই করা উপায় যা সম্ভবত আপনার পক্ষে কাজ করবে তবে আপনার বিশেষ প্রয়োজনের উপর নির্ভর করে না।
অন্যদিকে, DyanmicObject
একটি সহায়ক বেসটাইপ যা অনন্য গতিশীল আচরণগুলির সাথে আপনার নিজস্ব প্রকারগুলি কার্যকর এবং সহজ করে তোলে।
উপরের উদাহরণ উত্সটির উপর ভিত্তি করে একটি দরকারী টিউটোরিয়াল।
DynamicObject
: ওভাররাইড করার সময় TryGetMember
, আপনি যদি মিথ্যা ফেরান একটি RuntimeBinderException
অ-বিদ্যমান সম্পত্তি অ্যাক্সেস করার চেষ্টা করার সময় নিক্ষেপ করা হবে। স্নিপেটটি আসলে কাজ করার জন্য আপনার ফিরে আসা উচিত true
।
সি # ভাষা অনুসারে স্পেসিফিকেশন dynamic
একটি প্রকারের ঘোষণা। অর্থাৎ dynamic x
ভেরিয়েবলের x
টাইপ রয়েছে dynamic
।
DynamicObject
এটি এমন এক প্রকার যা প্রয়োগ করা সহজ করে IDynamicMetaObjectProvider
এবং প্রকারের জন্য নির্দিষ্ট বাঁধাই আচরণকে ওভাররাইড করে।
ExpandoObject
এমন একটি প্রকার যা প্রপার্টি ব্যাগের মতো কাজ করে। অর্থাৎ আপনি রানটাইমের সময় এই ধরণের গতিশীল উদাহরণগুলিতে বৈশিষ্ট্য, পদ্ধতি এবং আরও যোগ করতে পারেন।
dynamic
প্রকৃত ধরণের নয় ... সংকলককে এই ভেরিয়েবলের জন্য দেরি বাঁধাই ব্যবহার করতে বলার কেবল ইঙ্গিত। dynamic
ভেরিয়েবল আসলে হিসেবে ঘোষণা করা হয় object
MSIL মধ্যে
উপরের উদাহরণটি DynamicObject
স্পষ্টভাবে পার্থক্যটি জানায় না, কারণ এটি মূলত ইতিমধ্যে সরবরাহ করা কার্যকারিতা বাস্তবায়ন করে ExpandoObject
।
নীচে উল্লিখিত দুটি লিঙ্কে এটি খুব স্পষ্ট যে এর সহায়তায় DynamicObject
প্রকৃত প্রকারটি ( XElement
নীচের লিঙ্কগুলিতে ব্যবহৃত উদাহরণে) সংরক্ষণ করা / পরিবর্তন করা এবং সম্পত্তি এবং পদ্ধতিগুলির উপর আরও ভাল নিয়ন্ত্রণ করা সম্ভব।
public class DynamicXMLNode : DynamicObject
{
XElement node;
public DynamicXMLNode(XElement node)
{
this.node = node;
}
public DynamicXMLNode()
{
}
public DynamicXMLNode(String name)
{
node = new XElement(name);
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
XElement setNode = node.Element(binder.Name);
if (setNode != null)
setNode.SetValue(value);
else
{
if (value.GetType() == typeof(DynamicXMLNode))
node.Add(new XElement(binder.Name));
else
node.Add(new XElement(binder.Name, value));
}
return true;
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
XElement getNode = node.Element(binder.Name);
if (getNode != null)
{
result = new DynamicXMLNode(getNode);
return true;
}
else
{
result = null;
return false;
}
}
}