C#-এ null লিটারাল একটি মানের অনুপস্থিতি বোঝাতে ব্যবহার করা হয়। একটি নালেবল টাইপ হলো এমন একটি টাইপ যা null মান গ্রহণ করতে দেয়।
C# 8.0-এর আগে, রেফারেন্স টাইপগুলো সর্বদা নালেবল ছিল আর ভ্যালু টাইপগুলো ছিল না। একটি ভ্যালু টাইপের শেষে একটি প্রশ্নচিহ্ন (?) যোগ করে সেটিকে নালেবল করা যায়।
string nullableReferenceType = "hello";
nullableReferenceType = null; // Valid as type is nullable
int nonNullableValueType = 5;
nonNullableValueType = null; // Compile error as type is not nullable
int? nullableValueType = 5; // Define nullable value type
nullableValueType = null; // Valid as type is nullable
একটি null ভ্যারিয়েবলের মেম্বার অ্যাক্সেস করলে কম্পাইল এরর হয় না, বরং এর ফলে রানটাইমে একটি NullReferenceException থ্রো হয়:
string sentence = null;
// Throws NullReferenceException at runtime
sentence.Length;
এই কমন ধরনের ভুল প্রতিরোধ করতে, C# 8 এমন একটি ফিচার বেছে নেওয়ার সুযোগ দেয় যা ডিফল্টভাবে রেফারেন্স টাইপগুলোকে নন-নালেবল করে দেয়:
string nonNullableReferenceType = "book";
nonNullableReferenceType = null; // Compile warning (no error!)
string? nullableReferenceType = "movie";
nullableReferenceType = null; // Valid as type is nullable
নালেবল মানগুলো নিয়ে নিরাপদে কাজ করতে, সেগুলো ব্যবহারের আগে দেখে নিন সেগুলো null কি না:
string NormalizedName(string? name)
{
if (name == null)
{
return "UNKNOWN";
}
// Value is not null at this point, so no compile warning
// and no runtime NullReferenceException being thrown
return name.ToUpper();
}
NormalizedName(null); // => "UNKNOWN"
NormalizedName("Elisabeth"); // => "ELISABETH"
?? অপারেটরটি মানটি null হলে একটি ডিফল্ট ভ্যালু রিটার্ন করার সুযোগ দেয়:
string? name1 = "John";
name1 ?? "Paul"; // => "John"
string? name2 = null;
name2 ?? "George"; // => "George"
?. অপারেটরটি সম্ভাব্য null মানের ওপর নিরাপদে মেম্বার কল করার সুযোগ দেয়:
string? fruit = "apple";
fruit?.Length; // => 5
string? vegetable = null;
vegetable?.Length; // => null
এই অনুশীলনীতে আপনি কারখানার কর্মীদের জন্য নেম ব্যাজ প্রিন্ট করার কোড লিখবেন।
কর্মীদের একটি ID, একটি নাম ও একটি ডিপার্টমেন্টের নাম থাকে। কর্মীদের ব্যাজের লেবেল এভাবে ফরম্যাট করা হয়: "[id] - name - DEPARTMENT". একজন কর্মীর ব্যাজের লেবেল রিটার্ন করার জন্য (static) Badge.Print() মেথডটি ইমপ্লিমেন্ট করুন:
Badge.Print(734, "Ernest Johnny Payne", "Strategic Communication");
// => "[734] - Ernest Johnny Payne - STRATEGIC COMMUNICATION"
খেয়াল করুন, লেবেলে ডিপার্টমেন্টের নাম বড় হাতের অক্ষরে থাকবে।
কম্পিউটার সিস্টেমের একটি খুঁতের কারণে, নতুন কর্মীরা কারখানায় কাজ শুরু করার সময় মাঝে মাঝে তখনও কোনো ID পায় না। ব্যাজ বাধ্যতামূলক হওয়ায়, তারা ID প্রিফিক্স ছাড়া একটি অস্থায়ী ব্যাজ পাবে। যে নতুন কর্মীদের তখনও কোনো ID নেই তাদের সাপোর্ট করার জন্য (static) Badge.Print() মেথডটি পরিবর্তন করুন:
Badge.Print(id: null, "Jane Johnson", "Procurement");
// => "Jane Johnson - PROCUREMENT"
এমনকি কারখানার মালিককেও সব সময় একটি ব্যাজ পরতে হয়। তবে মালিকের কোনো ডিপার্টমেন্ট থাকে না। এক্ষেত্রে লেবেলে ডিপার্টমেন্টের নামের বদলে "OWNER" প্রিন্ট হওয়া উচিত। মালিকের জন্য একটি লেবেল প্রিন্ট করার জন্য (static) Badge.Print() মেথডটি পরিবর্তন করুন:
Badge.Print(254, "Charlotte Hale", department: null);
// => "[254] - Charlotte Hale - OWNER"
খেয়াল করুন, মালিকও যে নতুন কর্মী হবেন, সেটা সম্ভব:
Badge.Print(id: null, "Charlotte Hale", department: null);
// => "Charlotte Hale - OWNER"
Exercism-এ সাইন আপ করুন, C# ট্র্যাকের 62টি কনসেপ্ট178টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।