নীচে নিম্নলিখিত নিবন্ধ থেকে একটি পোস্ট করা হয়েছে :
জবরদস্তি এবং ingালাইয়ের মধ্যে পার্থক্য প্রায়শই উপেক্ষিত হয়। আমি দেখতে পাচ্ছি কেন; অনেক ভাষার উভয় ক্রিয়াকলাপের জন্য একই (বা অনুরূপ) বাক্য গঠন এবং পরিভাষা রয়েছে। কিছু ভাষা এমনকি কোনও রূপান্তরকে "ingালাই" হিসাবে উল্লেখ করতে পারে তবে নিম্নলিখিত ব্যাখ্যাটি সিটিএসের ধারণাগুলিকে বোঝায়।
আপনি যদি অন্য ধরণের কোনও স্থানে কোনও ধরণের মান নির্ধারণের চেষ্টা করছেন তবে আপনি নতুন ধরণের একটি মান উত্পন্ন করতে পারবেন যার মূলটির সাথে একই রকম অর্থ রয়েছে। এটা জবরদস্তি। জবরদস্তি আপনাকে কোনও নতুন মান তৈরি করে নতুন ধরণের ব্যবহার করতে দেয় যা কোনওভাবে মূলটির সাথে সাদৃশ্যপূর্ণ। কিছু জবরদস্তি ডেটা ফেলে দিতে পারে (উদাঃ 0x12345678 কে সংক্ষিপ্ত 0x5678 এ রূপান্তর করে), অন্যরা নাও করতে পারে (যেমন: 0x00000008 সংক্ষিপ্ত 0x0008 বা রূপান্তর 0x0000000000000008)।
মনে রাখবেন যে মানগুলির একাধিক প্রকার থাকতে পারে। যদি আপনার পরিস্থিতি কিছুটা পৃথক হয় এবং আপনি কেবলমাত্র মানের ধরণের একটি পৃথক নির্বাচন করতে চান তবে ingালাই কাজটির সরঞ্জাম। কাস্টিং সহজভাবে ইঙ্গিত দেয় যে আপনি কোনও নির্দিষ্ট ধরণের কোনও অপারেট করতে চান যা একটি মান অন্তর্ভুক্ত করে।
কোড স্তরে পার্থক্যটি সি # থেকে আইএল পর্যন্ত পরিবর্তিত হয়। সি # তে, কাস্টিং এবং জবরদস্তি উভয়ই মোটামুটি অনুরূপ:
static void ChangeTypes(int number, System.IO.Stream stream)
{
long longNumber = number;
short shortNumber = (short)number;
IDisposable disposableStream = stream;
System.IO.FileStream fileStream = (System.IO.FileStream)stream;
}
আইএল স্তরে এগুলি একেবারেই আলাদা:
ldarg.0
conv.i8
stloc.0
ldarg.0
conv.i2
stloc.1
ldarg.1
stloc.2
ldarg.1
castclass [mscorlib]System.IO.FileStream
stloc.3
যৌক্তিক স্তরের ক্ষেত্রে কিছু গুরুত্বপূর্ণ পার্থক্য রয়েছে। সবচেয়ে গুরুত্বপূর্ণ যেটি মনে রাখতে হবে তা হ'ল জবরদস্তি একটি নতুন মান তৈরি করে while আসল মান এবং কাস্টিংয়ের পরে মানটির পরিচয় একই হয়, তবে জোরালো মানের পরিচয় মূল মান থেকে পৃথক হয়; জালিয়াতি একটি নতুন, স্বতন্ত্র উদাহরণ তৈরি করে, যখন ingালাই করে না। একটি ছদ্মবেশটি হ'ল andালাইয়ের ফলাফল এবং মূলটি সর্বদা সমান (উভয়ই পরিচয় এবং সমতা উভয়ই), তবে একটি জোরালো মান মূলটির সাথে সমান হতে পারে বা নাও হতে পারে এবং কখনই আসল পরিচয়টি ভাগ করে না।
উপরের উদাহরণগুলিতে জবরদস্তির প্রভাবগুলি সহজেই দেখতে পাওয়া যায়, কারণ সংখ্যার প্রকারগুলি সর্বদা মান দ্বারা অনুলিপি করা হয়। আপনি যখন রেফারেন্স প্রকারের সাথে কাজ করছেন তখন জিনিসগুলি কিছুটা কৌশলযুক্ত হয়।
class Name : Tuple<string, string>
{
public Name(string first, string last)
: base(first, last)
{
}
public static implicit operator string[](Name name)
{
return new string[] { name.Item1, name.Item2 };
}
}
নীচের উদাহরণে, একটি রূপান্তর একটি castালাই, অন্যটি জবরদস্তি।
Tuple<string, string> tuple = name;
string[] strings = name;
এই রূপান্তরগুলির পরে, টিপল এবং নাম সমান, তবে স্ট্রিংগুলি তাদের উভয়ের সাথে সমান নয়। নাম এবং স্ট্রিংয়ের তুলনা করার জন্য নাম শ্রেণিতে সমান () এবং অপারেটর == () প্রয়োগ করে আপনি পরিস্থিতিটি কিছুটা ভাল (বা কিছুটা বিভ্রান্তিকর) করতে পারেন। এই অপারেটরগুলি তুলনা সমস্যাটি "ঠিক" করবে, তবে আপনার এখনও দুটি পৃথক দৃষ্টান্ত থাকবে; স্ট্রিংগুলিতে কোনও পরিবর্তন নাম বা টিউপলে প্রতিফলিত হবে না, অন্যদিকে নাম বা টুপলের যে কোনও একটিতে নাম এবং টিপল প্রতিফলিত হবে তবে স্ট্রিংগুলিতে নয়।
যদিও উপরের উদাহরণটি castালাই এবং জবরদস্তির মধ্যে কিছু পার্থক্য বোঝানোর জন্য বোঝানো হয়েছিল, এটি সি # তে রেফারেন্স টাইপের সাথে রূপান্তর অপারেটরদের ব্যবহার সম্পর্কে কেন আপনাকে অত্যন্ত সতর্ক হওয়া উচিত তার একটি দুর্দান্ত উদাহরণ হিসাবে কাজ করে।