আমি একটি nullable int মান নির্ধারণ করতে বিভিন্ন পদ্ধতি ব্যবহার করে এ সম্পর্কে কিছু গবেষণা করেছি। আমি বিভিন্ন জিনিস যখন এই কি ঘটেছে। কি চলছে তা স্পষ্ট করে দেওয়া উচিত। মনে রাখবেন: Nullable<something>
বা শর্টহ্যান্ড something?
এমন একটি কাঠামো যার জন্য কম্পাইলার মনে হচ্ছে শূন্যতার সাথে আমাদের ব্যবহার করতে যেন এটি কোনও শ্রেণি।
আপনি নীচে দেখতে পাবেন, SomeNullable == null
এবং SomeNullable.HasValue
সর্বদা প্রত্যাশিত সত্য বা মিথ্যা ফিরে আসবে। যদিও নিচে প্রদর্শিত না হয়, SomeNullable == 3
বৈধ খুব (অভিমানী SomeNullable একটি হল int?
)।
যদিও SomeNullable.Value
আমাদের একটি রানটাইম ত্রুটি পায় যদি আমরা নির্ধারিত null
করতে SomeNullable
। এটি প্রকৃতপক্ষে একমাত্র ক্ষেত্রে যেখানে ওভারলোডেড অপারেটরগুলির সংশ্লেষের কারণে ধন্যবাদগুলি আমাদের সমস্যার কারণ হতে পারেobject.Equals(obj)
পদ্ধতি এবং সংকলক অপ্টিমাইজেশন এবং বানরের ব্যবসা।
আমি দৌড়েছি এমন কিছু কোডের বর্ণনা এবং এটি লেবেলে কী আউটপুট উত্পন্ন করেছিল তা এখানে রয়েছে:
int? val = null;
lbl_Val.Text = val.ToString(); //Produced an empty string.
lbl_ValVal.Text = val.Value.ToString(); //Produced a runtime error. ("Nullable object must have a value.")
lbl_ValEqNull.Text = (val == null).ToString(); //Produced "True" (without the quotes)
lbl_ValNEqNull.Text = (val != null).ToString(); //Produced "False"
lbl_ValHasVal.Text = val.HasValue.ToString(); //Produced "False"
lbl_NValHasVal.Text = (!(val.HasValue)).ToString(); //Produced "True"
lbl_ValValEqNull.Text = (val.Value == null).ToString(); //Produced a runtime error. ("Nullable object must have a value.")
lbl_ValValNEqNull.Text = (val.Value != null).ToString(); //Produced a runtime error. ("Nullable object must have a value.")
ঠিক আছে, পরবর্তী প্রারম্ভিক পদ্ধতিটি চেষ্টা করে দেখুন:
int? val = new int?();
lbl_Val.Text = val.ToString(); //Produced an empty string.
lbl_ValVal.Text = val.Value.ToString(); //Produced a runtime error. ("Nullable object must have a value.")
lbl_ValEqNull.Text = (val == null).ToString(); //Produced "True" (without the quotes)
lbl_ValNEqNull.Text = (val != null).ToString(); //Produced "False"
lbl_ValHasVal.Text = val.HasValue.ToString(); //Produced "False"
lbl_NValHasVal.Text = (!(val.HasValue)).ToString(); //Produced "True"
lbl_ValValEqNull.Text = (val.Value == null).ToString(); //Produced a runtime error. ("Nullable object must have a value.")
lbl_ValValNEqNull.Text = (val.Value != null).ToString(); //Produced a runtime error. ("Nullable object must have a value.")
আগের মতই সব। মনে রাখবেন যে int? val = new int?(null);
কন্সট্রাক্টরকে নাল দিয়ে প্রারম্ভিককরণ করা হলে একটি জটিল সময় ত্রুটি তৈরি করতে পারে, যেহেতু nullable অবজেক্টের VALUE নমনীয় নয়। এটি কেবল মোড়কের বস্তু যা নালকে সমান করতে পারে।
তেমনি, আমরা এর থেকে একটি সংকলন সময় ত্রুটি পেয়ে যাব:
int? val = new int?();
val.Value = null;
val.Value
এটি যেভাবেই পঠনযোগ্য সম্পত্তি, তা উল্লেখ না করা , যার অর্থ আমরা এমন কিছু ব্যবহার করতে পারি না:
val.Value = 3;
তবে আবার, বহুতল ওভারলোডেড অন্তর্নিহিত রূপান্তর অপারেটররা আমাদের করুক:
val = 3;
পলিসমথিং সম্পর্কে কী চিন্তা করার দরকার নেই যদিও এতক্ষণ এটি সঠিকভাবে কাজ করে? :)