সি # ৪. তে ব্যবহৃত 'ডায়নামিক' প্রকারটি কী?


236

সি # 4.0 'ডায়নামিক' নামে একটি নতুন ধরণের প্রবর্তন করেছিল। এটি সমস্ত ভাল শোনাচ্ছে তবে কোনও প্রোগ্রামার এটি কীসের জন্য ব্যবহার করবে?

এমন কোনও পরিস্থিতি আছে যেখানে এটি দিনটি বাঁচাতে পারে?



সিওএম বা গতিশীল টাইপ করা ভাষাগুলির সাথে কাজ করার সময় এটি দরকারী। উদাহরণস্বরূপ, আপনি যদি নিজের ভাষা স্ক্রিপ্টিংয়ের জন্য লুয়া বা পাইথন ব্যবহার করেন তবে কেবল স্ক্রিপ্টিং কোডে কল করা খুব সুবিধাজনক কারণ এটি সাধারণ কোড।
কোডসইনচাউস


আমি আশা করি এই নিবন্ধটি আপনার প্রশ্নের ভিজ্যুয়াল স্টুডিওম্যাগাজিন.com
বিকাশকারী

উত্তর:


196

ডায়নামিক কীওয়ার্ডটি সি # ৪.০-তে নতুন এবং এটি সংকলকটি বলতে ব্যবহৃত হয় যে কোনও ভেরিয়েবলের ধরণ পরিবর্তন হতে পারে বা রানটাইম পর্যন্ত এটি জানা যায় না। এটিকে কোনও বস্তুর কাস্ট না করেই এটির সাথে ইন্টারঅ্যাক্ট করতে সক্ষম হিসাবে ভাবেন।

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 ফিচারস.এএসপিএক্স


96
ব্যক্তিগতভাবে আমি dynamicস্ট্যান্ডার্ড সি # বৈশিষ্ট্য এবং স্থির টাইপিং দ্বারা সমাধান করতে পারে (সম্ভবত আরও ভাল) সমস্যাগুলি সমাধানের জন্য সি # ইন ব্যবহার করার চিন্তাকে পছন্দ করি না বা সর্বাধিক টাইপ ইনফারেন্স ( var) দিয়ে। dynamicউচিত শুধুমাত্র ব্যবহার করা যেতে যখন এটি DLR সঙ্গে interoperabilty বিষয় আসে। আপনি যদি সি # এর মতো একটি স্থিত টাইপ করা ভাষায় কোড লিখেন তবে তা করুন এবং একটি গতিশীল ভাষা অনুকরণ করবেন না। ঠিক কুরুচিপূর্ণ।
ফিলিপ ডাবমিয়ার

40
আপনি যদি আপনার dynamicকোডটিতে ভেরিয়েবলগুলির ভারী ব্যবহার করেন তবে যেখানে আপনার প্রয়োজন নেই (যেমন আপনার স্কোয়াররুটের সাথে উদাহরণস্বরূপ) আপনি পরিষ্কার সংকলন সময় ত্রুটি পরীক্ষা করা ছেড়ে দেন; পরিবর্তে আপনি এখন রানটাইম ত্রুটিগুলি পাচ্ছেন।
ফিলিপ ডাবমিয়ার

33
বেশিরভাগ সূক্ষ্ম, তবে কয়েকটি ছোটখাটো ত্রুটি। প্রথমত, এটি বলা ঠিক নয় যে গতিশীল মানে ভেরিয়েবলের ধরণ পরিবর্তন হতে পারে। প্রশ্নের পরিবর্তনশীলটি টাইপ "গতিশীল" (সি # ভাষার দৃষ্টিকোণ থেকে; সিএলআরের দৃষ্টিকোণে ভেরিয়েবল টাইপ অবজেক্টের)। ভেরিয়েবলের ধরণ কখনও পরিবর্তন হয় না । ভেরিয়েবলের মানের রানটাইম টাইপ কোনও চলকের ধরণের সাথে সামঞ্জস্যপূর্ণ হতে পারে। (বা রেফারেন্সের ধরণের ক্ষেত্রে এটি বাতিল হয়ে যেতে পারে))
এরিক লিপার্ট

15
আপনার দ্বিতীয় পয়েন্টটি সম্পর্কে: সি # এর মধ্যে ইতিমধ্যে "একটি ভেরিয়েবল তৈরি করা যায় যা আপনি কোনও কিছুতে রাখতে পারেন" - এর বৈশিষ্ট্যটি আপনি সর্বদা টাইপ অবজেক্টের একটি পরিবর্তনশীল করতে পারেন। ডায়নামিক সম্পর্কে আকর্ষণীয় বিষয়টি আপনার প্রথম অনুচ্ছেদে আপনি কী দেখিয়েছেন: গতিশীল হ'ল বস্তুর কাছে অদৃশ্য, ব্যাতিক্রম ব্যতীত বিশ্লেষণ রানটাইম পর্যন্ত স্থগিত হয় এবং অভিব্যক্তির রানটাইম ধরণের উপর সিন্থেটিক বিশ্লেষণ করা হয়। (বেশিরভাগ ক্ষেত্রে। কিছু ব্যতিক্রম রয়েছে))
এরিক লিপার্ট

18
আমি এটিতে একটি ডাউনভোট পয়েন্ট ব্যয় করেছি, মূলত কারণ এটি স্পষ্টভাবে সাধারণ ব্যবহারের জন্য মূল শব্দটির ব্যবহারের পক্ষে। এর একটি সুনির্দিষ্টভাবে লক্ষ্যযুক্ত উদ্দেশ্য রয়েছে (লাসসের উত্তরে নিখুঁতভাবে বর্ণিত) এবং যদিও এই উত্তরটি প্রযুক্তিগতভাবে সঠিক - এটি বিকাশকারীদের বিপথগামী করার সম্ভাবনা রয়েছে।
আট-বিট গুরু

211

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 গুলি প্রবর্তন করে কাজ করা আরও সহজ করা হয়েছে:

  1. .চ্ছিক যুক্তি
  2. মেকিং refএর COM API গুলির জন্য ঐচ্ছিক
  3. নাম যুক্তি

উপরের কলটির জন্য নতুন সিনট্যাক্সটি হ'ল:

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

আর রুবির জন্য? একটি পৃথক এপিআই এখনও।

জাভাস্ক্রিপ্ট? একই চুক্তি, তার জন্য আলাদা এপিআই।

গতিশীল কীওয়ার্ড দুটি জিনিস নিয়ে গঠিত:

  1. সি # তে নতুন কীওয়ার্ড, dynamic
  2. রানটাইম ক্লাসগুলির একটি সেট যা বিভিন্ন ধরণের অবজেক্টগুলির সাথে কীভাবে ডিল করতে হয় তা জানে, যা একটি নির্দিষ্ট এপিআই প্রয়োগ করে যা 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

পুরো উদ্দেশ্যটি ছিল অন্য ধরণের অবজেক্টের সাথে কথা বলা সহজ করা।

কীওয়ার্ড, সমর্থক, বিরোধী, আলোচনা, অনুদান, প্রশংসা ইত্যাদি সম্পর্কে ইন্টারনেটে প্রচুর পরিমাণে উপাদান রয়েছে

আমি আপনাকে নীচের লিঙ্কগুলি দিয়ে শুরু করার পরামর্শ দিই এবং তারপরে আরও গুগল করুন:


12
এটি ওয়েব জেএসওএন এপিআই-এর জন্য COM থেকে দূরে দরকারী যেখানে ডি-সিরিয়ালযুক্ত JSON অবজেক্টগুলির কাঠামো সি # তে নির্দিষ্ট করা হয়নি। উদাহরণস্বরূপ System.Web.Helpers.Json এর ডিকোড পদ্ধতিটি একটি গতিশীল অবজেক্ট প্রদান করে
ডাম্বলডেড

একটি সরাইয়া সম্পর্কে "তারা এখনও C # এর একটি শক্তিশালী ভাবে টাইপ ভাষা হিসেবে বিবেচনা": এরিক Lippert হয় না এর "শক্তিশালী ভাবে টাইপ" একটি পাখা একটি বিবরণ হিসাবে।
অ্যান্ড্রু কীটন

আমি তার সাথে একমত নই, তবে এটি মতের বিষয়, বাস্তবে নয়। আমার কাছে "দৃ typ়ভাবে টাইপ করা" এর অর্থ হ'ল সংকলকটি সংকলনের সময়, কোন প্রকারটি ব্যবহৃত হয় তা জেনে থাকে এবং এই ধরণের চারপাশে নির্ধারিত নিয়মগুলি কার্যকর করে। আপনি নিয়মিত যাচাই এবং রানটাইমের বাধ্যবাধকতা স্থগিত করে এমন একটি গতিশীল টাইপ বেছে নিতে পারেন তা আমার কাছে বোঝায় না যে ভাষা দুর্বলভাবে টাইপ করা হয়েছে। আমি সাধারণত দুর্বল টাইপ করা টাইপের সাথে জোরালোভাবে টাইপ করি না, তবে আমি সাধারণত এটি পাইথনের মতো ভাষার মতো গতিশীল টাইপের সাথে তুলনা করি, যেখানে সবকিছু ছোঁড়া না হওয়া পর্যন্ত সবকিছুই হাঁসের মতো।
লাসে ভি কার্লসেন

এই উত্তরের মূল বক্তব্য কী? এর অর্ধেকটি optionচ্ছিক পরামিতি এবং আইডিপ্যাচ ইন্টারফেস সম্পর্কে।
Xam

এজন্য dynamicযুক্ত করা হয়েছিল, প্রতিবিম্বের মতো পদ্ধতির অনুরোধ কীভাবে করা যায় তার জন্য অন্যান্য বাস্তুতন্ত্রকে সমর্থন করার জন্য, পাশাপাশি এটি অর্জনের একটি ডকুমেন্টেড পদ্ধতি সহ ডেটা স্ট্রাকচারগুলিতে এক ধরণের ব্ল্যাক বক্স পদ্ধতির সরবরাহ করতে হবে।
লাসে ভি কার্লসেন

29

আমি অবাক যে কেউ একাধিক প্রেরণের কথা উল্লেখ করেনি । এটিকে ঘিরে কাজ করার স্বাভাবিক উপায়টি ভিজিটর প্যাটার্নের মাধ্যমে হয় এবং এটি সর্বদা সম্ভব হয় না তাই আপনি স্ট্যাক করা 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অযৌক্তিক সিরিয়ালাইজেশন নির্দিষ্ট বৈশিষ্ট্যগুলির সাথে দূষিত করতে ।


এই ব্যবহারের কেস সম্পর্কে জানতেন না। যদিও কিছুটা হ্যাকি সেরা। এটি কোনও স্থির বিশ্লেষককে ফেলে দেবে।
কুগেল

2
@ কুগেল এটি সত্য, তবে আমি এটিকে হ্যাক বলব না । স্থিতিশীল বিশ্লেষণ ভাল, তবে আমি এটিকে আমাকে মার্জিত সমাধান থেকে বাধা দিতে দেব না, যেখানে বিকল্পগুলি হ'ল: ওপেন-ক্লোজড নীতি লঙ্ঘন (দর্শনার্থীর প্যাটার্ন) বা isঅন্যের উপরে ভীত স্তুপীকৃত একটি চক্রবৃত্তীয় জটিলতা ।
স্টিলিওস অ্যাডামেন্টিডিস

4
আচ্ছা আপনার কাছে সি # 7 এর সাথে প্যাটার্ন মেলানোর বিকল্প রয়েছে, না?
কুগেল

2
ঠিক আছে অপারেটররা সেভাবে অনেক কম ব্যয়বহুল (ডাবল কাস্ট এড়ানো) এবং আপনি স্থির বিশ্লেষণ ফিরে পাবেন ;-) এবং পারফরম্যান্স।
কুগেল

@ আইডব্রাই দয়া করে আমার উত্তর পরিবর্তন করবেন না। একটি মন্তব্য পড়তে নির্দ্বিধায় এবং আমি এখনও এই সম্প্রদায়টিতে সক্রিয় থাকায় আমি স্পষ্ট করে বলব (যদি প্রয়োজন হয়)। এছাড়াও, দয়া করে ব্যবহার করবেন না magic; যাদু বলে কিছু নেই।
স্টিলিওস অ্যাডামেন্টিডিস

11

স্ট্যাটিক টাইপযুক্ত ভাষাগুলি (সিএলআর) ডিএলআর (গতিশীল ভাষার রানটাইম) এ চলমান গতিশীল (অজগর, রুবি ...) এর সাথে আন্তঃসংযোগ স্থাপনকে আরও সহজ করে তোলে, দেখুন এমএসডিএন :

উদাহরণস্বরূপ, আপনি সিএমএলে এক্সএমএলে কাউন্টার বাড়ানোর জন্য নিম্নলিখিত কোডটি ব্যবহার করতে পারেন।

Scriptobj.SetProperty("Count", ((int)GetProperty("Count")) + 1);

ডিএলআর ব্যবহার করে আপনি একই ক্রিয়াকলাপের পরিবর্তে নিম্নলিখিত কোডটি ব্যবহার করতে পারেন।

scriptobj.Count += 1;

এমএসডিএন এই সুবিধাগুলি তালিকাভুক্ত করে:

  • .NET ফ্রেমওয়ার্কে গতিময় ভাষাগুলি পোর্টিংকে সহজতর করে
  • স্ট্যাটিকালি টাইপ করা ভাষায় গতিশীল বৈশিষ্ট্য সক্ষম করে
  • ডিএলআর এবং .NET ফ্রেমওয়ার্কের ভবিষ্যত সুবিধা প্রদান করে
  • গ্রন্থাগার ও বিষয়গুলির ভাগ করে নেওয়া সক্ষম করে
  • দ্রুত গতিশীল প্রেরণ এবং আমন্ত্রণ সরবরাহ করে

আরও তথ্যের জন্য এমএসডিএন দেখুন ।


1
এবং ডায়নামিকের জন্য তার ভিএম প্রয়োজনীয় পরিবর্তনটি আসলে গতিময় ভাষাগুলি সহজ করে তোলে।
ডায়কাম

2
@ ডাইকাম: ভিএম-তে কোনও পরিবর্তন নেই। ডিএলআর .NET 2.0 এ পুরোপুরি সূক্ষ্মভাবে কাজ করে।
Jörg W Mittag

@ জার্গ, হ্যাঁ একটি পরিবর্তন আছে। ডিএলআর আংশিকভাবে আবার লিখিত কারণ এটি এখন গতিশীল সমাধানের জন্য ভিএম সমর্থন করে।
ডায়কাম

আমি কিছুটা আশাবাদী ছিলাম, গবেষণা দেখায় যে পরিবর্তনগুলি এত বড় ছিল না।
ডায়কাম

4

ব্যবহারের একটি উদাহরণ:

আপনি অনেকগুলি ক্লাস গ্রাস করেন যার একটি সম্প্রদায় সম্পত্তি 'ক্রিয়েশনডেট' রয়েছে:

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;
    }

7
হাঁসের টাইপিং, দুর্দান্ত। তবে আপনার এটির জন্য একটি ইন্টারফেস ব্যবহার করা উচিত those
কুগেল


2

এটি বেশিরভাগ আরএডি এবং পাইথন আক্রান্তদের দ্বারা কোডের গুণমান, ইন্টেলিজেন্স ধ্বংস করতে এবং সময় বাগ সনাক্তকরণের সংকলন করতে ব্যবহৃত হবে ।


একটি ছদ্মবেশী উত্তর কিন্তু সহজেই সত্য। আমি ফলাফলটি স্ট্রাকস ডিক্লেয়ার এড়ানোর জন্য এটি সহজভাবেই দেখেছি যে কোডটি যদি ভাল হয় তবে তা কাজ করে তবে আপনি পনির স্থানান্তরিত হওয়ার সাথে সাথে তার স্ট্যাকটি অনাকাঙ্ক্ষিত উপায়ে ফুটিয়ে তুলেছেন।
অ্যান্টনিভিও

হ্যাঁ আপনি দেখতে পাবেন যে অন্যান্য ভাষার বৈশিষ্ট্যগুলির সাথে ক্লাসিক কর্নার কাটিং। আপনি এখানে এটি দেখতে চাইলে অবাক হওয়ার কিছু নেই।
হক্কে 4040

1

এটি রানটাইমের সময় মূল্যায়ন করে, তাই আপনি যা চান জাভাস্ক্রিপ্টে আপনার পছন্দ মতো টাইপটি স্যুইচ করতে পারেন। এটি বৈধ:

dynamic i = 12;
i = "text";

এবং তাই আপনি যেমন প্রয়োজন তেমন পরিবর্তন করতে পারেন। এটি সর্বশেষ উপায় হিসাবে ব্যবহার করুন; এটি উপকারী, তবে আমি শুনেছি উত্পন্ন আইএল হিসাবে অনেকগুলি পর্দার আওতায় চলেছে এবং এটি একটি পারফরম্যান্স মূল্যে আসতে পারে।


7
আমি বলতে দ্বিধা বোধ করব যে এটি "বৈধতা"। এটি অবশ্যই সংকলন করবে, সুতরাং এটি "জাতির কোড" অর্থে যে সংকলকটি এখন এটি সংকলন করবে এবং রানটাইম এটি চালাবে। তবে আমি যে কোডটি রক্ষণ করি সেগুলির মধ্যে আমি সেই নির্দিষ্ট অংশের কোডটি (বা এটির অনুরূপ কিছু) কখনই দেখতে চাই না বা এটি একটি অদূরে-গুলি চালানো অপরাধ হবে।
লাসে ভি কার্লসেন

6
অবশ্যই, তবে এটি "গতিশীল" এর পরিবর্তে "অবজেক্ট" সহ "লিট" হত। আপনি এখানে গতিশীল সম্পর্কে আকর্ষণীয় কিছু দেখান নি।
এরিক লিপার্ট

বস্তুর জন্য, আপনাকে এটিকে যথাযথ প্রকারে ফেলে দিতে হবে, আসলে এর যে কোনও পদ্ধতিতে অনুরোধ করার জন্য ... আপনি স্বাক্ষরটি হারাবেন; আপনার কোডটি সংকলন ত্রুটি ছাড়াই যে কোনও পদ্ধতিতে কল করতে পারে, এবং এটি রানটাইমে ত্রুটিযুক্ত। টাইপ করার তাড়া ছিল, নির্দিষ্ট না করার জন্য দুঃখিত। এবং @ লাস, আমি সম্মতি জানাব এবং আমি সম্ভবত গতিশীল বেশি ব্যবহার করব না।
ব্রায়ান মেইন

1
সর্বশেষ রিসর্ট ব্যবহারের
কেসটি

1

আমার জন্য 'ডায়নামিক' টাইপ ভেরিয়েবলগুলির সর্বোত্তম ব্যবহারের ঘটনাটি ছিল যখন সম্প্রতি আমি 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;
        }

0
  1. আপনি পাইথননেট ব্যবহার করে গতিময় ভাষায় যেমন সিপিথনগুলিতে কল করতে পারেন:

dynamic np = Py.Import("numpy")

  1. dynamicতাদের উপর সংখ্যার অপারেটর প্রয়োগ করার সময় আপনি জেনেরিকগুলি ফেলে দিতে পারেন । এটি ধরণের সুরক্ষা সরবরাহ করে এবং জেনেরিকের সীমাবদ্ধতা এড়ায়। এটি সংক্ষেপে * হাঁসের টাইপিং:

T y = x * (dynamic)x, কোথায় typeof(x) is T


0

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
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.