কম্পিউটার টিউটোরিয়াল

C#-তে ?? (Null-Coalescing) অপারেটর কী?

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 ?? নেই)
  • থ্রেড-সেফ নয় যদি শেয়ার্ড মিউটেবল স্টেট ব্যবহার করা হয় (তবে সাধারণত ইমিউটেবল ভ্যালু ব্যবহার হয়)
  1. স্কেলেবল (Scalable) শব্দটির অর্থ কী?

  2. টুইটারে বায়ো (Bio) মানে কী?

  3. পাইথনে ডাবল স্টার (**) অপারেটর কী বোঝায়?

  4. পাইথনে স্টার (*) অপারেটর কী বোঝায়?