Null-Coalescing Operator (??)
?? অপারেটর বাম পক্ষের অপারেন্ড null নয় তবে সেটি রিটার্ন করে, null হলে ডান পক্ষের অপারেন্ড ইভ্যালুয়েট করে সেটি রিটার্ন করে।
সিনট্যাক্স ও আচরণ
T result = leftOperand ?? rightOperand;
// সমতুল্য:
T result = leftOperand != null ? leftOperand : rightOperand;
- শর্ট-সার্কিট: বাম পক্ষ null না হলে ডান পক্ষ ইভ্যালুয়েট হয় না
- নালেবল টাইপ:
int?,string,CustomClass— সবটাই কাজ করে - চেইনিং:
a ?? b ?? c ?? default— প্রথম নন-নাল ভ্যালু পাওয়া যায়
উদাহরণ
using System;
namespace MyApplication {
class Program {
static void Main(string[] args) {
// নালেবল ইন্ট
int? value1 = null;
int value2 = value1 ?? 99; // value1 null, তাই 99
Console.WriteLine($"Value2: {value2}"); // 99
// স্ট্রিং (রেফারেন্স টাইপ)
string testString = "Null Coalescing";
string resultString = testString ?? "Original string is null";
Console.WriteLine($"Result: {resultString}"); // Null Coalescing
// চেইনিং
string a = null, b = null, c = "Found!";
string firstNonNull = a ?? b ?? c ?? "Default";
Console.WriteLine(firstNonNull); // Found!
// এক্সপ্রেশন বডি মেথডে
string GetName(string input) => input ?? "Anonymous";
}
}
}
আউটপুট:
Value2: 99 Result: Null Coalescing Found!
সুবিধা
- ডিফল্ট ভ্যালু সেট: নালেবল আইটেমের জন্য ফলব্যাক
- InvalidOperationException প্রতিরোধ:
Nullable<T>.Valueঅ্যাক্সেস করলে এক্সেপশন,??দিয়ে সেফ - কোড সংক্ষিপ্ত: বহু
if (x == null)ব্লক এড়ায় - রিডেবিলিটি: ইন্টেন্ট স্পষ্ট — "null হলে এই ডিফল্টটি ব্যবহার কর"
- ভ্যালু টাইপ + রেফারেন্স টাইপ: দুটোই সাপোর্ট
Null-Coalescing Assignment (??=) — C# 8.0+
// শুধু null হলে অ্যাসাইন করে
string name = null;
name ??= "Default Name"; // name = "Default Name"
name = "John";
name ??= "Default Name"; // name remains "John" (অ্যাসাইন হয় না)
ব্যবহারিক উদাহরণ
// কনফিগারেশন ফলব্যাক
string connStr = config["ConnectionString"]
?? Environment.GetEnvironmentVariable("CONN_STR")
?? "DefaultConnection";
// ক্যাশে-দেন-ডাটাবেস প্যাটার্ন
var data = cache.Get(key) ?? await db.GetAsync(key) ?? defaultValue;
// ডিঅপস্ট্রাকচারিং
var (x, y) = (point?.X ?? 0, point?.Y ?? 0);
সতর্কতা
??শুধু null চেক করে — empty string (""), ০, false চেক করে না- ওভারলোড করা যায় না (অপারেটর ওভারলোডিংয়ের জন্য
operator ??নেই) - থ্রেড-সেফ নয় যদি শেয়ার্ড মিউটেবল স্টেট ব্যবহার করা হয় (তবে সাধারণত ইমিউটেবল ভ্যালু ব্যবহার হয়)