সংক্ষিপ্ত উত্তর:
সমতা জটিল।
বিস্তারিত উত্তর:
প্রিমিটিভ টাইপগুলি বেসটি ওভাররাইড করে object.Equals(object)এবং বাক্স objectএকই ধরণের এবং মানের হয় তবে সত্য হয় return (দ্রষ্টব্য যে এটি ক্ষয়যোগ্য প্রকারের জন্যও কাজ করবে; নন-নাল nallable প্রকারগুলি অন্তর্নিহিত ধরণের উদাহরণ হিসাবে সর্বদা বাক্স থাকে))
যেহেতু newAgeএকটি short, Equals(object)তাই আপনি যদি একই মানের সাথে একটি বাক্স সংক্ষিপ্ত পাস করেন তবে এর পদ্ধতিটি কেবল সত্যটি প্রত্যাবর্তন করে । আপনি একটি বাক্সযুক্ত উত্তীর্ণ int, তাই এটি মিথ্যা ফিরে।
বিপরীতে, ==অপারেটর দুটি intগুলি (বা shortগুলি বা longগুলি) গ্রহণ হিসাবে সংজ্ঞায়িত করা হয় ।
যখন আপনি এটি একটি কল intএবং short, কম্পাইলার পরোক্ষভাবে রূপান্তর করবে shortকরার intএবং তার ফলে তুলনা intমান গুলি।
এটি কাজ করার অন্যান্য উপায়
আদিম ধরণেরগুলির নিজস্ব Equals()পদ্ধতি রয়েছে যা একই ধরণের গ্রহণ করে।
আপনি যদি লিখেন age.Equals(newAge), সংকলক int.Equals(int)সেরা ওভারলোড হিসাবে নির্বাচন করবে এবং স্পষ্টত রূপান্তরিত shortকরবে int। এটি তখন ফিরে আসবে true, যেহেতু এই পদ্ধতিটি কেবলমাত্র সরাসরিগুলির সাথে তুলনা করে int।
shortএছাড়াও একটি short.Equals(short)পদ্ধতি আছে, কিন্তু intস্পষ্টভাবে রূপান্তর করা যায় না short, তাই আপনি এটি কল করছেন না।
আপনি একটি কাস্ট দিয়ে এই পদ্ধতিটি কল করতে বাধ্য করতে পারেন:
Console.WriteLine(newAge.Equals((short)age)); // true
short.Equals(short)এটি বক্সিং ছাড়াই সরাসরি কল করবে । যদি age32767 এর চেয়ে বড় হয় তবে এটি একটি ওভারফ্লো ব্যতিক্রম ছুঁড়ে দেবে।
আপনি short.Equals(object)ওভারলোডকেও কল করতে পারেন , তবে স্পষ্টভাবে একটি বক্সযুক্ত বস্তুটি পাস করুন যাতে এটি একই ধরণের হয়:
Console.WriteLine(newAge.Equals((object)(short)age)); // true
পূর্ববর্তী বিকল্পের মতো, এটি কোনও ক্ষেত্রে ফিট না হলে এটি একটি ওভারফ্লো ফেলে দেবে short। পূর্ববর্তী সমাধানের বিপরীতে, এটি shortসময় এবং স্মৃতি নষ্ট করে একটি বস্তুকে বক্স করবে ।
সোর্স কোড:
Equals()আসল উত্স কোড থেকে দুটি পদ্ধতি এখানে রয়েছে :
public override bool Equals(Object obj) {
if (!(obj is Int16)) {
return false;
}
return m_value == ((Int16)obj).m_value;
}
public bool Equals(Int16 obj)
{
return m_value == obj;
}
আরও পড়া:
এরিক লিপার্ট দেখুন ।