ইন। নেট:
প্রায়ই আপনাকে, কি পরিবর্তনশীল ধরণ একটি ফাংশন গ্রাস করবে উপর নির্ভর করতে পারবে না যাতে আপনি একটি বস্তু পরিবর্তনশীল যা সর্বনিম্ন বিভাজকদের থেকে প্রসারিত করে ব্যবহার করতে হবে - নেট এ এই হল object
।
তবে object
এটি একটি শ্রেণি এবং রেফারেন্স হিসাবে এর বিষয়বস্তু সংরক্ষণ করে।
List<int> notBoxed = new List<int> { 1, 2, 3 };
int i = notBoxed[1]; // this is the actual value
List<object> boxed = new List<object> { 1, 2, 3 };
int j = (int) boxed[1]; // this is an object that can be 'unboxed' to an int
যদিও এই উভয়ই একই তথ্য রাখে দ্বিতীয় তালিকাটি বৃহত্তর এবং ধীর। দ্বিতীয় তালিকার প্রতিটি মান আসলে একটি রেফারেন্স object
যা হোল্ড করে int
।
এটিকে বক্সযুক্ত বলা হয় কারণ এটি int
দ্বারা মোড়ানো থাকে object
। যখন এর কাস্ট int
ব্যাকটি আনবক্স করা হয় - তার মানটিতে ফিরে রূপান্তর।
মান ধরণের জন্য (যেমন সমস্ত structs
) এটি ধীর এবং সম্ভাব্যভাবে আরও অনেক বেশি স্থান ব্যবহার করে।
রেফারেন্সের ধরণের জন্য (যেমন সমস্ত classes
) এটি কোনও সমস্যার তুলনায় অনেক কম, কারণ সেগুলি যাইহোক রেফারেন্স হিসাবে সংরক্ষণ করা হয়।
একটি বক্সযুক্ত মান ধরণের আরও সমস্যা হ'ল এটি মানের চেয়ে বাক্সের সাথে কাজ করছেন তা স্পষ্ট নয়। যখন আপনি দুটি তুলনা করেন structs
তখন আপনি মানগুলি তুলনা করছেন, তবে আপনি যখন দুটি তুলনা করেন classes
তখন (ডিফল্টরূপে) আপনি রেফারেন্সটি তুলনা করেন - অর্থাত্ এগুলি কি একই উদাহরণ?
বক্সযুক্ত মান ধরণের সাথে ডিল করার সময় এটি বিভ্রান্তিকর হতে পারে:
int a = 7;
int b = 7;
if(a == b) // Evaluates to true, because a and b have the same value
object c = (object) 7;
object d = (object) 7;
if(c == d) // Evaluates to false, because c and d are different instances
চারপাশে কাজ করা সহজ:
if(c.Equals(d)) // Evaluates to true because it calls the underlying int's equals
if(((int) c) == ((int) d)) // Evaluates to true once the values are cast
যাইহোক বক্সযুক্ত মানগুলি নিয়ে কাজ করার সময় সাবধান হওয়া অন্য জিনিস to