0Pricing
C# Academy · Pelajaran

Operator Null-Conditional & Null-Coalescing

Gabungkan ?., ?[], ??, dan ??= untuk menulis kode aman-null yang ringkas tanpa pemeriksaan null yang panjang.

Operator Null-Conditional & Null-Coalescing adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 4 pelajaran total.

Pola Kode Aman terhadap Null

C# menyediakan tiga operator khusus untuk menangani nilai null secara ringkas: null-conditional (?., ?[]), null-coalescing (??), dan assignment null-coalescing (??=). Jika digunakan bersama, operator tersebut menghilangkan sebagian besar kode pemeriksaan null yang panjang.

Operator Null-Conditional: ?.

?. langsung menghasilkan null jika sisi kiri bernilai null, alih-alih melempar NullReferenceException. Tipe hasilnya menjadi nullable.

User? user = GetUser(id);

// Without ?.:
string? name = null;
if (user != null) name = user.Name;

// With ?.:
string? name2 = user?.Name;

// Chained:
string? city = user?.Address?.City;

// Method call:
string? upper = user?.Name?.ToUpper();

Null-Conditional dengan Pengakses Indeks: ?[]

?[] adalah operator indeks null-conditional. Operator ini mengakses elemen array atau koleksi dengan aman ketika koleksi itu sendiri mungkin bernilai null.

List<string>? tags = product?.Tags;

// Safe index access
string? firstTag = tags?[0];

// Null-conditional LINQ
int? count = tags?.Count;
bool? hasItems = tags?.Any();

// With methods:
string? joined = tags?.FirstOrDefault()?.ToUpper();

Operator Null-Coalescing: ??

?? mengembalikan operand kiri jika nilainya tidak null; jika tidak, operator ini mengembalikan operand kanan (fallback). Operator ini merupakan pengganti ringkas untuk x != null ? x : fallback.

string? name = GetName();

// Without ??:
string display = name != null ? name : "Anonymous";

// With ??:
string display2 = name ?? "Anonymous";

// Chaining ?? for multiple fallbacks:
string result = primary ?? secondary ?? tertiary ?? "Default";

// Combining with ?.
string city = user?.Address?.City ?? "Unknown City";

Penugasan Penggabungan Null: ??=

??= menetapkan nilai di sisi kanan ke variabel hanya jika variabel tersebut saat ini bernilai null. Operator ini sangat cocok untuk pola inisialisasi saat diperlukan.

// Lazy initialization
private List<string>? _cache;

public List<string> GetCache()
{
    _cache ??= new List<string>(); // only assigns if null
    return _cache;
}

// Equivalent to:
// if (_cache is null) _cache = new List<string>();

// In-place:
string? name = null;
name ??= "Default";
Console.WriteLine(name); // "Default"

Menggunakan ?. dengan Peristiwa

Operator kondisional null adalah cara standar yang aman untuk utas dalam memanggil peristiwa—operator ini menghindari kondisi balapan akibat pemeriksaan null dan pemanggilan yang dilakukan secara terpisah.

public event EventHandler<DataEventArgs>? DataReceived;

// Thread-safe event invocation:
DataReceived?.Invoke(this, new DataEventArgs(data));

// This is equivalent to:
var handler = DataReceived;
if (handler != null) handler(this, new DataEventArgs(data));
// (local copy avoids race condition between check and invoke)

Contoh Perangkaian Kompleks

Menggabungkan berbagai operator memungkinkan navigasi yang bersih dan mudah dibaca melalui graf objek bertingkat secara aman terhadap null.

var order = GetOrder(id);

// Deeply nested with fallbacks:
string countryCode = order
    ?.Customer
    ?.ShippingAddress
    ?.Country
    ?.Code
    ?? "US";

// Collection safe access:
decimal firstLineTotal = order
    ?.Lines
    ?.FirstOrDefault()
    ?.Total
    ?? 0m;

// Method chain:
string? trackingUpper = order?.TrackingNumber?.ToUpper().Trim();

Operator Kondisional Null dalam LINQ

Operator kondisional null bekerja dengan lancar bersama LINQ, sehingga Anda dapat menjalankan kueri dengan aman pada koleksi atau properti yang dapat bernilai null.

List<Order>? orders = customer?.Orders;

// Safe LINQ on a nullable collection:
var totalRevenue = orders?.Sum(o => o.Total) ?? 0m;
var pendingCount = orders?.Count(o => o.Status == OrderStatus.Pending) ?? 0;
var latest       = orders?.MaxBy(o => o.PlacedAt)?.Id;

Penjagaan Null dengan ThrowIfNull

Untuk parameter yang tidak boleh bernilai null, gunakan ArgumentNullException.ThrowIfNull() (.NET 6+) agar validasi yang ringkas dan deskriptif dilakukan saat memasuki metode.

public void ProcessOrder(Order order, Customer customer)
{
    ArgumentNullException.ThrowIfNull(order);
    ArgumentNullException.ThrowIfNull(customer);

    // From this point, compiler knows both are non-null
    Console.WriteLine(order.Id);
    Console.WriteLine(customer.Name);
}

// .NET 7+: ArgumentException.ThrowIfNullOrEmpty
void Save(string name)
{
    ArgumentException.ThrowIfNullOrWhiteSpace(name);
    // name is guaranteed non-empty
}

Pola Bukan Null dalam Switch

Pencocokan pola dengan is not null dan is { } menyediakan pola pemeriksaan null yang jelas, khususnya dalam ekspresi switch.

string Describe(object? obj) => obj switch
{
    null                          => "nothing",
    string s when s.Length == 0  => "empty string",
    string s                      => $"string: {s}",
    int i                         => $"integer: {i}",
    { }                           => $"object: {obj.GetType().Name}"
};

// is not null in if statements:
if (order is not null && order.Customer is { Name: var name })
    Console.WriteLine(name);

Pemeriksaan Singkat

Apa yang dikembalikan oleh ekspresi user?.Name ?? "Anonymous" ketika user bernilai null?

Ringkasan: Kondisional Null & Penggabungan Null

Kesimpulan utama:

  • ?.: akses anggota yang aman—mengembalikan null alih-alih menimbulkan kesalahan pada penerima yang bernilai null
  • ?[]: akses indeks yang aman pada koleksi yang mungkin bernilai null
  • ??: nilai cadangan ketika operand kiri bernilai null
  • ??=: menetapkan nilai hanya jika null—sangat cocok untuk inisialisasi saat diperlukan
  • Rangkai operator tersebut: a?.B?.C ?? defaultVal untuk navigasi bertingkat yang aman terhadap null
  • ArgumentNullException.ThrowIfNull() untuk penjagaan validasi parameter

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Operator Null-Conditional & Null-Coalescing” gratis?

Ya — teks lengkap “Operator Null-Conditional & Null-Coalescing” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Operator Null-Conditional & Null-Coalescing”?

Gabungkan ?., ?[], ??, dan ??= untuk menulis kode aman-null yang ringkas tanpa pemeriksaan null yang panjang. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C# Academy?

Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Operator Null-Conditional & Null-Coalescing” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?

Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Mengaktifkan & Memahami NRT
  2. Anotasi: ?, !, MaybeNull & NotNull
  3. Operator Null-Conditional & Null-Coalescing
  4. Memigrasikan Codebase ke NRT
← Kembali ke C# Academy