সি # 4.0 'ডায়নামিক' নামে একটি নতুন ধরণের প্রবর্তন করেছিল। এটি সমস্ত ভাল শোনাচ্ছে তবে কোনও প্রোগ্রামার এটি কীসের জন্য ব্যবহার করবে?
এমন কোনও পরিস্থিতি আছে যেখানে এটি দিনটি বাঁচাতে পারে?
সি # 4.0 'ডায়নামিক' নামে একটি নতুন ধরণের প্রবর্তন করেছিল। এটি সমস্ত ভাল শোনাচ্ছে তবে কোনও প্রোগ্রামার এটি কীসের জন্য ব্যবহার করবে?
এমন কোনও পরিস্থিতি আছে যেখানে এটি দিনটি বাঁচাতে পারে?
উত্তর:
ডায়নামিক কীওয়ার্ডটি সি # ৪.০-তে নতুন এবং এটি সংকলকটি বলতে ব্যবহৃত হয় যে কোনও ভেরিয়েবলের ধরণ পরিবর্তন হতে পারে বা রানটাইম পর্যন্ত এটি জানা যায় না। এটিকে কোনও বস্তুর কাস্ট না করেই এটির সাথে ইন্টারঅ্যাক্ট করতে সক্ষম হিসাবে ভাবেন।
dynamic cust = GetCustomer();
cust.FirstName = "foo"; // works as expected
cust.Process(); // works as expected
cust.MissingMethod(); // No method found!
লক্ষ্য করুন আমাদের প্রকারের গ্রাহক হিসাবে কাস্ট করা বা ঘোষণা করার দরকার পড়েনি। যেহেতু আমরা এটিকে গতিশীল বলে ঘোষণা করেছি, রানটাইম শেষ হয়ে যায় এবং তারপরে আমাদের জন্য ফার্স্টনেম সম্পত্তি অনুসন্ধান করে সেট করে। এখন, অবশ্যই আপনি যখন ডায়নামিক ভেরিয়েবল ব্যবহার করছেন, আপনি সংকলক প্রকারের পরীক্ষা করা ছেড়ে দিচ্ছেন। এর অর্থ কল কাস্টম। মিসিংমথোড () সংকলন করবে এবং রানটাইম পর্যন্ত ব্যর্থ হবে না। এই অপারেশনের ফলাফলটি রানটাইমবাইন্ডার এক্সসেপশন কারণ মিসিংমথোড গ্রাহক শ্রেণিতে সংজ্ঞায়িত হয়নি।
উপরের উদাহরণটি দেখায় যে পদ্ধতি এবং বৈশিষ্ট্যগুলি কল করার সময় কীভাবে গতিশীল কাজ করে। অন্য একটি শক্তিশালী (এবং সম্ভাব্য বিপজ্জনক) বৈশিষ্ট্যটি বিভিন্ন ধরণের ডেটার জন্য ভেরিয়েবলগুলি পুনরায় ব্যবহার করতে সক্ষম হচ্ছে। আমি নিশ্চিত যে পাইথন, রুবি এবং পার্ল প্রোগ্রামাররা এর সুবিধা নেওয়ার জন্য এক মিলিয়ন উপায় সম্পর্কে ভাবতে পারে, তবে আমি সি # এতদিন ব্যবহার করে এসেছি যে এটি আমার কাছে কেবল "ভুল" বোধ করে।
dynamic foo = 123;
foo = "bar";
ঠিক আছে, তাই সম্ভবত আপনি প্রায়শই উপরের মতো কোডটি লেখবেন না। অনেক সময় থাকতে পারে, যখন পরিবর্তনশীল পুনরায় ব্যবহার কার্যকর হতে পারে বা লিগ্যাসি কোডের একটি নোংরা টুকরো পরিষ্কার করতে পারে। একটি প্রায়শই সাধারণ ক্ষেত্রে আমি প্রায়শই দশমিক এবং দ্বিগুণের মধ্যে কাস্ট করতে হয়।
decimal foo = GetDecimalValue();
foo = foo / 2.5; // Does not compile
foo = Math.Sqrt(foo); // Does not compile
string bar = foo.ToString("c");
দ্বিতীয় লাইনটি সংকলন করে না কারণ 2.5 ডাবল হিসাবে টাইপ করা হয় এবং 3 লাইনটি সংকলন করে না কারণ ম্যাথ.এসকিআরআরটি দ্বিগুণ আশা করে। স্পষ্টতই, আপনাকে যা করতে হবে তা হ'ল cast
dynamic foo = GetDecimalValue(); // still returns a decimal
foo = foo / 2.5; // The runtime takes care of this for us
foo = Math.Sqrt(foo); // Again, the DLR works its magic
string bar = foo.ToString("c");
আরও বৈশিষ্ট্য পড়ুন: http://www.codeproject.com/KB/cs/CSharp4 ফিচারস.এএসপিএক্স
dynamic
স্ট্যান্ডার্ড সি # বৈশিষ্ট্য এবং স্থির টাইপিং দ্বারা সমাধান করতে পারে (সম্ভবত আরও ভাল) সমস্যাগুলি সমাধানের জন্য সি # ইন ব্যবহার করার চিন্তাকে পছন্দ করি না বা সর্বাধিক টাইপ ইনফারেন্স ( var
) দিয়ে। dynamic
উচিত শুধুমাত্র ব্যবহার করা যেতে যখন এটি DLR সঙ্গে interoperabilty বিষয় আসে। আপনি যদি সি # এর মতো একটি স্থিত টাইপ করা ভাষায় কোড লিখেন তবে তা করুন এবং একটি গতিশীল ভাষা অনুকরণ করবেন না। ঠিক কুরুচিপূর্ণ।
dynamic
কোডটিতে ভেরিয়েবলগুলির ভারী ব্যবহার করেন তবে যেখানে আপনার প্রয়োজন নেই (যেমন আপনার স্কোয়াররুটের সাথে উদাহরণস্বরূপ) আপনি পরিষ্কার সংকলন সময় ত্রুটি পরীক্ষা করা ছেড়ে দেন; পরিবর্তে আপনি এখন রানটাইম ত্রুটিগুলি পাচ্ছেন।
dynamic
কীওয়ার্ডটি যোগ করা হয়েছিল একসঙ্গে সি # 4.0 অন্যান্য অনেক নতুন বৈশিষ্ট্য সঙ্গে, এটা সহজ কোড কথা বলতে করতে যে জীবন বা অন্যান্য রানটাইম, বিভিন্ন API গুলি আছে থেকে আসে।
একটি উদাহরণ নিন।
যদি আপনার কাছে কোনও COM অবজেক্ট থাকে, যেমন অবজেক্টের মতো Word.Application
, এবং একটি নথি খুলতে চান, তবে এটি করার পদ্ধতিটি 15 প্যারামিটারের চেয়ে কম নয়, যার বেশিরভাগটি areচ্ছিক।
এই পদ্ধতিটি কল করতে আপনার এই জাতীয় কিছু দরকার হবে (আমি সরলীকরণ করছি, এটি আসল কোড নয়):
object missing = System.Reflection.Missing.Value;
object fileName = "C:\\test.docx";
object readOnly = true;
wordApplication.Documents.Open(ref fileName, ref missing, ref readOnly,
ref missing, ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing);
এই সমস্ত যুক্তি নোট করুন? সংস্করণ 4.0 এর আগে আপনার সি # থেকে পাস করার দরকার নেই চ্ছিক আর্গুমেন্টের ধারণা নেই। সি # 4.0 এ, COM API গুলি প্রবর্তন করে কাজ করা আরও সহজ করা হয়েছে:
ref
এর COM API গুলির জন্য ঐচ্ছিকউপরের কলটির জন্য নতুন সিনট্যাক্সটি হ'ল:
wordApplication.Documents.Open(@"C:\Test.docx", ReadOnly: true);
এটি দেখতে কত সহজ দেখায়, আরও কত পাঠযোগ্য হয়?
এটি পৃথক করা যাক:
named argument, can skip the rest
|
v
wordApplication.Documents.Open(@"C:\Test.docx", ReadOnly: true);
^ ^
| |
notice no ref keyword, can pass
actual parameter values instead
ম্যাজিকটি হ'ল সি # সংকলক এখন প্রয়োজনীয় কোডটি ইনজেক্ট করবে এবং রানটাইমের সময় নতুন ক্লাসগুলির সাথে কাজ করবে, আপনি আগে যা করেছেন ঠিক তেমন কাজ করার জন্য, তবে বাক্য গঠনটি আপনার কাছ থেকে গোপন করা হয়েছে, এখন আপনি ফোকাস করতে পারেন কী , এবং কীভাবে এতটা নয় । অ্যান্ডারস হেজলসবার্গ এটি বলার অনুরাগী যে আপনাকে বিভিন্ন "উদ্বেগ" ডাকা উচিত, যা পুরো জিনিসটির যাদুতে এক ধরণের শোধক, যেখানে আপনাকে সাধারণত আপনার হাত (গুলি) waveেউ করতে হয় এবং সঠিকভাবে ক্রমে কিছু যাদু শব্দ বলতে হয় have স্পেল চলার একটি নির্দিষ্ট ধরণের পেতে। COM অবজেক্টের সাথে কথা বলার পুরানো এপিআই উপায়টি ছিল অনেকটা, আপনার জন্য কোডটি সংকলন করার জন্য সংকলকটি বাক্সবিন্যাস করার জন্য আপনাকে প্রচুর হুপের মধ্য দিয়ে ঝাঁপিয়ে পড়তে হবে।
সংস্করণ ৪. এর পূর্বে সি # তে জিনিসগুলি আরও বিচ্ছিন্ন হয়ে যায় যদি আপনি কোনও সিওএম অবজেক্টের সাথে কথা বলার চেষ্টা করেন যে আপনার কোনও ইন্টারফেস বা শ্রেণি নেই, আপনার কাছে যা আছে তা একটি IDispatch
রেফারেন্স।
এটি কী তা যদি আপনি না জানেন IDispatch
তবে মূলত COM অবজেক্টের প্রতিচ্ছবি। একটি IDispatch
ইন্টারফেসের সাহায্যে আপনি "সেভ হিসাবে পরিচিত পদ্ধতির আইডি নম্বরটি কী" অবজেক্টটি জিজ্ঞাসা করতে পারেন এবং আর্গুমেন্টের মানগুলি সহ একটি নির্দিষ্ট ধরণের অ্যারে তৈরি করতে পারেন এবং অবশেষে Invoke
পদ্ধতিটি কল করার জন্য IDispatch
ইন্টারফেসে একটি পদ্ধতি কল করতে পারেন, সমস্ত পাস করে আপনি যে তথ্যটি একসাথে স্ক্রঞ্জ করতে সক্ষম হয়েছেন
উপরের সংরক্ষণ পদ্ধতিটি দেখতে দেখতে এটি দেখতে (এটি অবশ্যই সঠিক কোড নয়):
string[] methodNames = new[] { "Open" };
Guid IID = ...
int methodId = wordApplication.GetIDsOfNames(IID, methodNames, methodNames.Length, lcid, dispid);
SafeArray args = new SafeArray(new[] { fileName, missing, missing, .... });
wordApplication.Invoke(methodId, ... args, ...);
এইগুলি কেবল একটি নথি খোলার জন্য।
অনেক আগে থেকেই বাক্সের বাইরে এই বেশিরভাগের জন্য ভিবিতে alচ্ছিক যুক্তি এবং সমর্থন ছিল, সুতরাং এই সি # কোড:
wordApplication.Documents.Open(@"C:\Test.docx", ReadOnly: true);
মূলত কেবল সি # হ'ল ভাববোধের দিক থেকে ভিবি-র কাছে ধরা, তবে এটি প্রসারিত করে কেবল সঠিকভাবে না করে কেবল সিএম এর পক্ষে নয়। অবশ্যই এটি VB.NET বা .NET রানটাইমের উপরে নির্মিত অন্য কোনও ভাষার জন্যও উপলভ্য।
আপনি যদি উইকিপিডিয়া: আইডিপ্যাচে এই IDispatch
ইন্টারফেসটি সম্পর্কে আরও তথ্য জানতে চান তবে আরও তথ্য পেতে পারেন । এটা সত্যিই ভয়ানক জিনিস।
তবে, আপনি যদি পাইথন অবজেক্টের সাথে কথা বলতে চান? সিওএম অবজেক্টের জন্য ব্যবহৃত একটির চেয়ে আলাদা আলাদা এপিআই রয়েছে এবং পাইথন অবজেক্টগুলি যেমন প্রকৃতিতেও গতিশীল তাই কল করার সঠিক পদ্ধতিগুলি, তাদের প্যারামিটারগুলি ইত্যাদির জন্য আপনাকে প্রতিবিম্ব যাদুতে অবলম্বন করতে হবে তবে নেট নয় N প্রতিচ্ছবি, পাইথনের জন্য রচিত কিছু, উপরের আইডিপ্যাচ কোডের মতো, সম্পূর্ণ আলাদা different
আর রুবির জন্য? একটি পৃথক এপিআই এখনও।
জাভাস্ক্রিপ্ট? একই চুক্তি, তার জন্য আলাদা এপিআই।
গতিশীল কীওয়ার্ড দুটি জিনিস নিয়ে গঠিত:
dynamic
dynamic
মূলশব্দটির প্রয়োজন হয় এবং কলগুলি জিনিসগুলি করার সঠিক উপায়ে ম্যাপ করে। এপিআই এমনকি নথিভুক্ত করা হয়েছে, সুতরাং যদি আপনার কাছে এমন কোনও জিনিস থাকে যা রানটাইম থেকে coveredেকে না আসে তবে আপনি এটি যুক্ত করতে পারেন।মূল dynamic
শব্দটি কোনও বিদ্যমান NET- কেবল কোডটি প্রতিস্থাপনের উদ্দেশ্যে বোঝানো হয়নি। অবশ্যই, আপনি এটি করতে পারেন , তবে এটি সেই কারণে যুক্ত করা হয়নি, এবং সামনে আন্ডারস হেজলসবার্গের সাথে সি # প্রোগ্রামিং ভাষার লেখকরা সবচেয়ে দৃama়ভাবে দৃ that়ভাবে বলেছেন যে তারা এখনও সি # কে দৃ strongly়ভাবে টাইপ করা ভাষা হিসাবে বিবেচনা করে এবং ত্যাগ করবে না যে নীতি।
এর অর্থ হ'ল যদিও আপনি কোডটি এইভাবে লিখতে পারেন:
dynamic x = 10;
dynamic y = 3.14;
dynamic z = "test";
dynamic k = true;
dynamic l = x + y * z - k;
এবং এটি সংকলন করুন, এটি কোনও ধরণের ম্যাজিক-লেস-ফিগার-আউট-কী-আপনি-সময়ে-রানটাইম টাইপের সিস্টেমের মতো নয় meant
পুরো উদ্দেশ্যটি ছিল অন্য ধরণের অবজেক্টের সাথে কথা বলা সহজ করা।
কীওয়ার্ড, সমর্থক, বিরোধী, আলোচনা, অনুদান, প্রশংসা ইত্যাদি সম্পর্কে ইন্টারনেটে প্রচুর পরিমাণে উপাদান রয়েছে
আমি আপনাকে নীচের লিঙ্কগুলি দিয়ে শুরু করার পরামর্শ দিই এবং তারপরে আরও গুগল করুন:
dynamic
যুক্ত করা হয়েছিল, প্রতিবিম্বের মতো পদ্ধতির অনুরোধ কীভাবে করা যায় তার জন্য অন্যান্য বাস্তুতন্ত্রকে সমর্থন করার জন্য, পাশাপাশি এটি অর্জনের একটি ডকুমেন্টেড পদ্ধতি সহ ডেটা স্ট্রাকচারগুলিতে এক ধরণের ব্ল্যাক বক্স পদ্ধতির সরবরাহ করতে হবে।
আমি অবাক যে কেউ একাধিক প্রেরণের কথা উল্লেখ করেনি । এটিকে ঘিরে কাজ করার স্বাভাবিক উপায়টি ভিজিটর প্যাটার্নের মাধ্যমে হয় এবং এটি সর্বদা সম্ভব হয় না তাই আপনি স্ট্যাক করা is
চেকগুলি শেষ করেন ।
সুতরাং এখানে আমার নিজের প্রয়োগের বাস্তব জীবনের উদাহরণ রয়েছে। পরিবর্তে:
public static MapDtoBase CreateDto(ChartItem item)
{
if (item is ElevationPoint) return CreateDtoImpl((ElevationPoint)item);
if (item is MapPoint) return CreateDtoImpl((MapPoint)item);
if (item is MapPolyline) return CreateDtoImpl((MapPolyline)item);
//other subtypes follow
throw new ObjectNotFoundException("Counld not find suitable DTO for " + item.GetType());
}
তুমি কর:
public static MapDtoBase CreateDto(ChartItem item)
{
return CreateDtoImpl(item as dynamic);
}
private static MapDtoBase CreateDtoImpl(ChartItem item)
{
throw new ObjectNotFoundException("Counld not find suitable DTO for " + item.GetType());
}
private static MapDtoBase CreateDtoImpl(MapPoint item)
{
return new MapPointDto(item);
}
private static MapDtoBase CreateDtoImpl(ElevationPoint item)
{
return new ElevationDto(item);
}
নোট যে প্রথম ক্ষেত্রে ElevationPoint
এর উপশ্রেণী হয় MapPoint
এবং এটি যদি স্থাপন না করার আগে MapPoint
তা পৌঁছে করা হবে না। ডায়নামিকের ক্ষেত্রে এটি নয়, কারণ নিকটতম ম্যাচিং পদ্ধতিটি বলা হবে।
আপনি কোড থেকে অনুমান করতে পারেন, আমি চার্ট আইটেম থেকে তাদের সিরিয়ালযোগ্য সংস্করণগুলিতে অনুবাদ সম্পাদন করতে গিয়ে সেই বৈশিষ্ট্যটি কার্যকর হয়েছিল। আমি দর্শকদের সাথে আমার কোডটি কলুষিত করতে চাইনি এবং আমি চাইও না যে আমার ChartItem
অযৌক্তিক সিরিয়ালাইজেশন নির্দিষ্ট বৈশিষ্ট্যগুলির সাথে দূষিত করতে ।
is
অন্যের উপরে ভীত স্তুপীকৃত একটি চক্রবৃত্তীয় জটিলতা ।
magic
; যাদু বলে কিছু নেই।
স্ট্যাটিক টাইপযুক্ত ভাষাগুলি (সিএলআর) ডিএলআর (গতিশীল ভাষার রানটাইম) এ চলমান গতিশীল (অজগর, রুবি ...) এর সাথে আন্তঃসংযোগ স্থাপনকে আরও সহজ করে তোলে, দেখুন এমএসডিএন :
উদাহরণস্বরূপ, আপনি সিএমএলে এক্সএমএলে কাউন্টার বাড়ানোর জন্য নিম্নলিখিত কোডটি ব্যবহার করতে পারেন।
Scriptobj.SetProperty("Count", ((int)GetProperty("Count")) + 1);
ডিএলআর ব্যবহার করে আপনি একই ক্রিয়াকলাপের পরিবর্তে নিম্নলিখিত কোডটি ব্যবহার করতে পারেন।
scriptobj.Count += 1;
এমএসডিএন এই সুবিধাগুলি তালিকাভুক্ত করে:
- .NET ফ্রেমওয়ার্কে গতিময় ভাষাগুলি পোর্টিংকে সহজতর করে
- স্ট্যাটিকালি টাইপ করা ভাষায় গতিশীল বৈশিষ্ট্য সক্ষম করে
- ডিএলআর এবং .NET ফ্রেমওয়ার্কের ভবিষ্যত সুবিধা প্রদান করে
- গ্রন্থাগার ও বিষয়গুলির ভাগ করে নেওয়া সক্ষম করে
- দ্রুত গতিশীল প্রেরণ এবং আমন্ত্রণ সরবরাহ করে
আরও তথ্যের জন্য এমএসডিএন দেখুন ।
ব্যবহারের একটি উদাহরণ:
আপনি অনেকগুলি ক্লাস গ্রাস করেন যার একটি সম্প্রদায় সম্পত্তি 'ক্রিয়েশনডেট' রয়েছে:
public class Contact
{
// some properties
public DateTime CreationDate { get; set; }
}
public class Company
{
// some properties
public DateTime CreationDate { get; set; }
}
public class Opportunity
{
// some properties
public DateTime CreationDate { get; set; }
}
আপনি যদি 'ক্রিয়েশনডেট' সম্পত্তির মান পুনরুদ্ধার করে এমন কোনও যোগাযোগ পদ্ধতি লিখে থাকেন তবে আপনাকে প্রতিবিম্বটি ব্যবহার করতে হবে:
static DateTime RetrieveValueOfCreationDate(Object item)
{
return (DateTime)item.GetType().GetProperty("CreationDate").GetValue(item);
}
'ডায়নামিক' ধারণাটি সহ, আপনার কোডটি অনেক বেশি মার্জিত:
static DateTime RetrieveValueOfCreationDate(dynamic item)
{
return item.CreationDate;
}
সিওএম ইন্টারপ। বিশেষত IUnعلوم। এটি এর জন্য বিশেষভাবে নকশা করা হয়েছিল।
এটি বেশিরভাগ আরএডি এবং পাইথন আক্রান্তদের দ্বারা কোডের গুণমান, ইন্টেলিজেন্স ধ্বংস করতে এবং সময় বাগ সনাক্তকরণের সংকলন করতে ব্যবহৃত হবে ।
এটি রানটাইমের সময় মূল্যায়ন করে, তাই আপনি যা চান জাভাস্ক্রিপ্টে আপনার পছন্দ মতো টাইপটি স্যুইচ করতে পারেন। এটি বৈধ:
dynamic i = 12;
i = "text";
এবং তাই আপনি যেমন প্রয়োজন তেমন পরিবর্তন করতে পারেন। এটি সর্বশেষ উপায় হিসাবে ব্যবহার করুন; এটি উপকারী, তবে আমি শুনেছি উত্পন্ন আইএল হিসাবে অনেকগুলি পর্দার আওতায় চলেছে এবং এটি একটি পারফরম্যান্স মূল্যে আসতে পারে।
আমার জন্য 'ডায়নামিক' টাইপ ভেরিয়েবলগুলির সর্বোত্তম ব্যবহারের ঘটনাটি ছিল যখন সম্প্রতি আমি ADO.NET এ একটি ডেটা অ্যাক্সেস স্তর লিখছিলাম ( এসকিউএলডাটা রিডার ব্যবহার করে ) এবং কোডটি ইতিমধ্যে লিখিত উত্তরাধিকার সঞ্চিত প্রক্রিয়াগুলিকে অনুরোধ করছিল। বেশিরভাগ ব্যবসার যুক্তিযুক্ত এমন কয়েকশটি উত্তরাধিকারী সঞ্চয় পদ্ধতি রয়েছে। আমার ডেটা অ্যাক্সেস লেয়ারটিকে কিছু যুক্তিযুক্ত করার জন্য ব্যবসায়ের লজিক স্তর, সি # ভিত্তিতে কিছু ধরণের কাঠামোগত ডেটা ফেরত পাঠানো দরকার ( যদিও প্রায় কিছুই নেই )। প্রতিটি সঞ্চিত পদ্ধতি বিভিন্ন উপাত্তের সেট ( টেবিল কলাম ) প্রদান করে। সুতরাং ফিরিয়ে নেওয়া ডেটা ধরে রাখতে এবং এটি বিএলএল-এ পাস করার জন্য কয়েক ডজন ক্লাস বা স্ট্রাক্ট তৈরি না করে আমি নীচের কোডটি লিখেছি যা বেশ মার্জিত এবং ঝরঝরে দেখাচ্ছে।
public static dynamic GetSomeData(ParameterDTO dto)
{
dynamic result = null;
string SPName = "a_legacy_stored_procedure";
using (SqlConnection connection = new SqlConnection(DataConnection.ConnectionString))
{
SqlCommand command = new SqlCommand(SPName, connection);
command.CommandType = System.Data.CommandType.StoredProcedure;
command.Parameters.Add(new SqlParameter("@empid", dto.EmpID));
command.Parameters.Add(new SqlParameter("@deptid", dto.DeptID));
connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
dynamic row = new ExpandoObject();
row.EmpName = reader["EmpFullName"].ToString();
row.DeptName = reader["DeptName"].ToString();
row.AnotherColumn = reader["AnotherColumn"].ToString();
result = row;
}
}
}
return result;
}
dynamic np = Py.Import("numpy")
dynamic
তাদের উপর সংখ্যার অপারেটর প্রয়োগ করার সময় আপনি জেনেরিকগুলি ফেলে দিতে পারেন । এটি ধরণের সুরক্ষা সরবরাহ করে এবং জেনেরিকের সীমাবদ্ধতা এড়ায়। এটি সংক্ষেপে * হাঁসের টাইপিং:T y = x * (dynamic)x
, কোথায় typeof(x) is T
dynamic
টাইপিংয়ের জন্য আরেকটি ব্যবহারের ক্ষেত্রে ভার্চুয়াল পদ্ধতির জন্য যা covariance বা বৈপরীত্যের সাথে সমস্যা অনুভব করে। এরকম একটি উদাহরণ হ'ল কুখ্যাত Clone
পদ্ধতি যা একই ধরণের কোনও অবজেক্টকে যে বস্তুটির উপরে ডাকা হয় সে হিসাবে ফিরিয়ে দেয়। ডায়নামিক রিটার্নের সাথে এই সমস্যাটি পুরোপুরি সমাধান করা যায় না কারণ এটি স্থির প্রকারের চেকিংকে বাইপাস করে, তবে কমপক্ষে আপনাকে প্লেইন ব্যবহারের সময় অনুযায়ী যতটা কুরুচিপূর্ণ কাস্ট ব্যবহার করা প্রয়োজন তা নয় object
। অন্যথায় বলতে গেলে, কাস্টগুলি অন্তর্ভুক্ত হয়ে যায়।
public class A
{
// attributes and constructor here
public virtual dynamic Clone()
{
var clone = new A();
// Do more cloning stuff here
return clone;
}
}
public class B : A
{
// more attributes and constructor here
public override dynamic Clone()
{
var clone = new B();
// Do more cloning stuff here
return clone;
}
}
public class Program
{
public static void Main()
{
A a = new A().Clone(); // No cast needed here
B b = new B().Clone(); // and here
// do more stuff with a and b
}
}