0Pricing
C# Academy · Pelajaran

Anotasi: ?, !, MaybeNull & NotNull

Gunakan ? untuk tipe nullable, ! untuk mengabaikan peringatan null, serta atribut seperti MaybeNull dan NotNullWhen untuk analisis alur yang akurat.

Anotasi: ?, !, MaybeNull & NotNull adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 2 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.

Melampaui ? dan !: Atribut Nullability

Anotasi dasar ? dan pemeriksaan null menangani sebagian besar kasus, tetapi beberapa pola memerlukan anotasi yang lebih ekspresif. Namespace System.Diagnostics.CodeAnalysis menyediakan atribut yang memberi compiler wawasan lebih mendalam tentang alur null.

MaybeNull dan NotNull

[MaybeNull] memberi tahu compiler bahwa tipe hasil non-nullable mungkin sebenarnya bernilai null dalam praktik (misalnya, metode generik). [NotNull] menjamin bahwa parameter nullable tidak akan bernilai null setelah pemanggilan.

using System.Diagnostics.CodeAnalysis;

// [MaybeNull]: return might be null even though T is non-nullable
[return: MaybeNull]
public T Find<T>(int id)
{
    // Returns default(T) which is null for reference types
    return _cache.TryGetValue(id, out var val) ? val : default!;
}

// [NotNull]: after this call, output is guaranteed non-null
public static void EnsureNotNull<T>(
    [NotNull] ref T? value,
    T defaultValue) where T : class
{
    value ??= defaultValue;
}

NotNullWhen: Non-Null Kondisional

[NotNullWhen(true)] memberi tahu compiler bahwa parameter output tidak null ketika metode mengembalikan true. Beginilah pola standar TryParse diberi anotasi.

using System.Diagnostics.CodeAnalysis;

public static bool TryParseEmail(
    string? input,
    [NotNullWhen(true)] out string? email)
{
    if (input?.Contains('@') == true)
    {
        email = input.Trim().ToLower();
        return true;
    }
    email = null;
    return false;
}

// Usage — no warning after true check:
if (TryParseEmail(raw, out var email))
    Console.WriteLine(email.Length); // safe — email is non-null here

MaybeNullWhen: Null Kondisional

[MaybeNullWhen(false)] adalah kebalikannya — output mungkin null ketika metode mengembalikan false. Atribut ini digunakan dalam pola kamus TryGetValue.

// This is how Dictionary<K,V>.TryGetValue is annotated:
public bool TryGetValue(
    TKey key,
    [MaybeNullWhen(false)] out TValue value)
{ ... }

// Usage:
if (!dict.TryGetValue("key", out var value))
    return; // early return — value is null in this branch

Console.WriteLine(value.Length); // safe after the guard

AllowNull dan DisallowNull

[AllowNull] pada properti non-nullable memungkinkan pemanggil meneruskan null kepadanya (misalnya, setter yang mengubah null menjadi string kosong). [DisallowNull] melarang null pada tipe nullable.

public class Config
{
    private string _name = "";

    // Allow setting null (setter converts null -> empty)
    [AllowNull]
    public string Name
    {
        get => _name;
        set => _name = value ?? "";
    }

    // Getter always returns non-null: fine
    // Setter accepts null: [AllowNull] tells compiler that's OK
}

NotNullIfNotNull: Meneruskan Nullability

[NotNullIfNotNull(paramName)] menyatakan: jika parameter X tidak null, nilai yang dikembalikan juga tidak null. Berguna untuk fungsi transformasi.

[return: NotNullIfNotNull(nameof(value))]
public static string? Normalize(string? value)
{
    return value?.Trim().ToLower();
}

// Usage:
string  name = "  Alice  ";
string  norm1 = Normalize(name)!; // guaranteed non-null
string? raw   = GetRaw();
string? norm2 = Normalize(raw);   // still nullable (raw might be null)

DoesNotReturn

[DoesNotReturn] menandai metode yang selalu melempar exception. Compiler mengetahui bahwa kode setelah pemanggilan tersebut tidak dapat dijangkau, sehingga menekan peringatan null yang keliru.

using System.Diagnostics.CodeAnalysis;

[DoesNotReturn]
public static void ThrowNotFound(int id)
    => throw new KeyNotFoundException($"Entity {id} not found");

// Usage — no null warning after the call:
var order = _db.Orders.Find(id);
if (order is null) ThrowNotFound(id);

Console.WriteLine(order.Id); // no CS8602 — compiler knows ThrowNotFound threw

MemberNotNull: Kondisi Setelah Pemanggilan pada Field

[MemberNotNull] memberi tahu compiler bahwa suatu metode menjamin field tertentu tidak null setelah metode tersebut selesai. Berguna untuk pembantu inisialisasi malas.

public class DataLoader
{
    private string? _data;

    [MemberNotNull(nameof(_data))]
    private void EnsureLoaded()
    {
        if (_data is null)
            _data = LoadFromFile();
    }

    public string GetData()
    {
        EnsureLoaded();
        return _data; // no CS8603 — compiler knows _data is set
    }
}

Menggabungkan Anotasi

Atribut dapat digabungkan untuk membuat kontrak API yang tepat. Berikut helper guard bergaya fluent yang menggabungkan beberapa atribut.

public static class Guard
{
    [return: NotNull]
    public static T NotNull<T>(
        [NotNull][AllowNull] T? value,
        [CallerArgumentExpression(nameof(value))] string? name = null)
        where T : class
    {
        ArgumentNullException.ThrowIfNull(value, name);
        return value;
    }
}

// Usage:
var product = Guard.NotNull(await _repo.FindAsync(id));
Console.WriteLine(product.Name); // no warning

Operator Null: ?. ?? ??=

Operator null-conditional (?.), null-coalescing (??), dan assignment null-coalescing (??=) menulis kode yang ringkas dan aman terhadap null tanpa pemeriksaan if yang panjang.

string? name = GetName();

// ?. safe navigation
int? len = name?.Length;
string? upper = name?.ToUpper().Trim();

// ?? default value
string display = name ?? "Anonymous";

// ??= lazy init
name ??= "Default";

// Chaining
string result = user?.Profile?.DisplayName ?? user?.Name ?? "Guest";

Pemeriksaan Singkat

Apa yang diberitahukan oleh [NotNullWhen(true)] pada parameter out kepada compiler?

Ringkasan: Anotasi Nullability

Inti pembelajaran:

  • [NotNullWhen(true)]: pola TryParse — tidak null saat hasilnya true
  • [MaybeNull]: tipe non-nullable tetap mungkin mengembalikan null (default generik)
  • [DoesNotReturn]: metode selalu melempar exception — kode setelahnya tidak dapat dijangkau
  • [MemberNotNull]: metode menjamin field telah diatur setelah metode selesai
  • ?., ??, ??=: navigasi aman terhadap null dan nilai bawaan yang ringkas

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Anotasi: ?, !, MaybeNull & NotNull” gratis?

Ya — teks lengkap “Anotasi: ?, !, MaybeNull & NotNull” 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 “Anotasi: ?, !, MaybeNull & NotNull”?

Gunakan ? untuk tipe nullable, ! untuk mengabaikan peringatan null, serta atribut seperti MaybeNull dan NotNullWhen untuk analisis alur yang akurat. 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 2 dari 4.

Berapa lama pelajaran “Anotasi: ?, !, MaybeNull & NotNull” 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