সি # সংকলকটি আবশ্যক যে যখনই কোনও কাস্টম প্রকার অপারেটরকে সংজ্ঞায়িত করে ==
, এটি অবশ্যই সংজ্ঞায়িত করতে হবে !=
( এখানে দেখুন )।
কেন?
আমি জানতে আগ্রহী যে ডিজাইনাররা কেন এটি প্রয়োজনীয় বলে মনে করেছিল এবং কেবল অপর উপস্থিত হলে অপারেটরগুলির মধ্যে যে কোনও একটির পক্ষে যুক্তিসঙ্গত বাস্তবায়নের ক্ষেত্রে কেন সংকলকটি ডিফল্ট করতে পারে না। উদাহরণস্বরূপ, লুয়া আপনাকে কেবল সমতা অপারেটরটি সংজ্ঞায়িত করতে দেয় এবং আপনি অন্যটি বিনামূল্যে পান। সি # আপনাকে == বা উভয় == এবং! = সংজ্ঞা দিতে অনুরোধ করতে পারে এবং তারপরে স্বয়ংক্রিয়ভাবে নিখোঁজ! = অপারেটর হিসাবে সংকলন করতে পারে !(left == right)
।
আমি বুঝতে পারি যে এমন এক অদ্ভুত কোণার কেস রয়েছে যেখানে কিছু সত্ত্বা সমান বা অসম নাও হতে পারে (যেমন আইইইই-75৫৪ এনএএন), তবে এগুলি ব্যতিক্রম বলে মনে হয়, নিয়ম হিসাবে নয়। সুতরাং এটি কেন ব্যাখ্যা করে না যে সি # সংকলক ডিজাইনাররা কেন ব্যতিক্রমটিকে নিয়ম বানিয়েছেন।
আমি দুর্বল কারিগরতার ক্ষেত্রে দেখেছি যেখানে সাম্যতা অপারেটরটি সংজ্ঞায়িত করা হয়, তারপরে অসমতার অপারেটরটি প্রতিটি তুলনা উল্টে এবং অন & এ পরিবর্তন করে একটি অনুলিপি-পেস্ট হয় || (আপনি পয়েন্টটি পান ... মূলত! (a == খ) ডি মরগানের বিধি দ্বারা প্রসারিত)। এটি লুয়ার ক্ষেত্রে যেমন সংকলক ডিজাইন দ্বারা মুছে ফেলতে পারে এটি একটি খারাপ অনুশীলন।
দ্রষ্টব্য: অপারেটরদের <> <=> = এর জন্য এটি একই holds আপনি অপ্রাকৃত উপায়ে এগুলি সংজ্ঞায়িত করতে হবে এমন ক্ষেত্রে আমি কল্পনা করতে পারি না। লুয়া আপনাকে কেবল <এবং <= এবং সংজ্ঞায়িত> = এবং> ফর্মারদের প্রত্যাখ্যানের মাধ্যমে সংজ্ঞায়িত করতে দেয়। কেন সি # একই কাজ করে না (কমপক্ষে 'ডিফল্টরূপে')?
সম্পাদনা
স্পষ্টতই প্রোগ্রামারটি তাদের পছন্দ মতো সাম্যতা এবং বৈষম্যের জন্য চেক প্রয়োগ করতে অনুমতি দেওয়ার বৈধ কারণ রয়েছে। উত্তরগুলির কয়েকটি এমন ক্ষেত্রে নির্দেশ করে যেখানে এটি দুর্দান্ত হতে পারে।
আমার প্রশ্নের কার্নেল, তবে, কেন যখন জোর করে সি # তে এটি প্রয়োজনীয় হয় যখন সাধারণত এটি যুক্তিযুক্তভাবে প্রয়োজন হয় না ?
এটি নেট। ইন্টারফেসের মতো নকশার পছন্দগুলির বিপরীতেও রয়েছে Object.Equals
, IEquatable.Equals
IEqualityComparer.Equals
যেখানে একটি অংশের অভাব NotEquals
দেখায় যে কাঠামোটি !Equals()
বস্তুগুলিকে অসম হিসাবে বিবেচনা করে এবং এটিই । তদুপরি, ক্লাসগুলির মতো Dictionary
এবং পদ্ধতিগুলি .Contains()
কেবল পূর্বোক্ত ইন্টারফেসের উপর নির্ভর করে এবং অপারেটরগুলি সংজ্ঞায়িত হলেও সরাসরি ব্যবহার করে না। আসলে, যখন রিশার্পার সমতা সদস্য তৈরি করে, এটি উভয় ==
এবং !=
শর্তাদির এবং উভয়ই সংজ্ঞায়িত করে Equals()
তবেই যদি ব্যবহারকারী মোটেই অপারেটর জেনারেট করতে পছন্দ করে। অবজেক্টের সাম্যতা বোঝার জন্য কাঠামোর দ্বারা সাম্যতা অপারেটরগুলির প্রয়োজন হয় না।
মূলত, .NET কাঠামো এই অপারেটরদের সম্পর্কে চিন্তা করে না, এটি কেবল কয়েকটি Equals
পদ্ধতি সম্পর্কে চিন্তা করে। ব্যবহারকারী দ্বারা মিলিয়ে == এবং! = অপারেটর উভয়কেই সংজ্ঞায়িত করার সিদ্ধান্ত নেওয়ার বিষয়টি ভাষা নকশার সাথে সম্পর্কিত এবং ড। সিএনটি সম্পর্কিত শব্দার্থবিজ্ঞানের সাথে সম্পর্কিত নয়।