Mengaktifkan & Memahami NRT
Aktifkan konteks nullable, pahami tipe referensi nullable dan non-nullable, lalu baca peringatan compiler.
Mengaktifkan & Memahami NRT adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 1 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.
Kesalahan Bernilai Miliaran Dolar
Tony Hoare (penemu null) menyebutnya sebagai “kesalahan bernilai miliaran dolar”. Dalam C#, tipe referensi apa pun secara bawaan dapat bernilai null, sehingga NullReferenceException menjadi kerusakan runtime yang paling umum. Nullable Reference Types (NRT) memperbaikinya pada tingkat compiler.
Mengaktifkan Konteks Nullable
Aktifkan NRT secara global dalam file proyek Anda atau per file menggunakan direktif. Setelah diaktifkan, compiler memperlakukan tipe referensi sebagai non-nullable secara bawaan.
<!-- In .csproj — enable for the whole project -->
<PropertyGroup>
<Nullable>enable</Nullable>
</PropertyGroup>
// Or per-file:
#nullable enable
// ... code with NRT warnings
#nullable disable
// ... code without NRT warningsTipe Referensi Non-Nullable vs Nullable
Dengan NRT diaktifkan: string berarti nilainya tidak pernah null, sedangkan string? berarti nilainya mungkin null. Compiler memberikan peringatan jika Anda menetapkan null ke tipe non-nullable atau melakukan dereferensi terhadap nullable tanpa pemeriksaan.
#nullable enable
string nonNull = "Hello"; // OK
string? maybeNull = null; // OK — explicitly nullable
nonNull = null; // WARNING: CS8600
Console.WriteLine(maybeNull.Length); // WARNING: CS8602 — may be null
// Fix:
if (maybeNull is not null)
Console.WriteLine(maybeNull.Length); // safeAnalisis Alur
Compiler melakukan analisis alur — compiler melacak state null melalui kondisional dan percabangan, serta menekan peringatan ketika dapat membuktikan bahwa suatu nilai tidak null.
string? name = GetName();
// After null check, name is treated as non-null:
if (name is not null)
Console.WriteLine(name.Length); // no warning
// Same with early return:
if (name is null) return;
Console.WriteLine(name.Length); // no warning — null was returned
// Pattern matching:
if (name is string s)
Console.WriteLine(s.ToUpper()); // no warningPeringatan Nullable: CS8600–CS8629
Peringatan NRT penting yang perlu dipahami: CS8600 (menetapkan null ke tipe non-nullable), CS8602 (dereferensi yang mungkin null), CS8603 (mengembalikan null untuk tipe non-nullable), CS8618 (field non-nullable yang belum diinisialisasi).
#nullable enable
public class Order
{
public string CustomerName { get; set; } // CS8618: not initialized
public string? TrackingNumber { get; set; } // OK — nullable
public Order(string name)
{
CustomerName = name; // now initialized — CS8618 gone
}
}
string? s = GetValue();
Console.WriteLine(s.Length); // CS8602: s might be nullMenginisialisasi Field Non-Nullable
CS8618 muncul ketika field atau properti non-nullable tidak diatur dalam konstruktor. Solusinya: lakukan inisialisasi saat deklarasi, wajibkan melalui konstruktor, atau gunakan operator null-forgiving untuk pola DI/ORM.
// Option 1: Initialize in declaration
public string Name { get; set; } = "";
// Option 2: Require via constructor
public class Product
{
public string Name { get; }
public Product(string name) => Name = name;
}
// Option 3: null-forgiving for ORM entities
public string Name { get; set; } = null!;
// null! tells compiler "trust me, this will be set by EF Core"Nullable dalam Tipe Generik
Parameter tipe generik dapat dibatasi agar non-nullable. Batasan where T : notnull memastikan T tidak pernah bernilai null.
// Without constraint: T could be nullable
public T? Find<T>(int id) { ... }
// With notnull: T must be a non-nullable type
public T FindRequired<T>(int id) where T : notnull
{
var result = InternalFind<T>(id);
return result ?? throw new KeyNotFoundException();
}
// T? is meaningful only when T is known to be non-nullable
public T? FindOrDefault<T>(int id) where T : class { ... }Nullable dalam Interface dan Override
Saat mengimplementasikan interface atau meng-override metode, anotasi nullability harus sesuai. Compiler memeriksa agar implementasi setidaknya sama non-nullable-nya dengan deklarasi pada interface.
public interface IRepository<T>
{
T? FindById(int id); // may return null
T GetOrThrow(int id); // never null
}
// Implementation:
public class ProductRepo : IRepository<Product>
{
public Product? FindById(int id) => _db.Find(id);
public Product GetOrThrow(int id) =>
_db.Find(id) ?? throw new KeyNotFoundException();
}Nullable Value Types vs Nullable Reference Types
Jangan keliru membedakan int? (Nullable<int> — pembungkus tipe nilai yang sudah ada sebelum C# 8) dengan string? (anotasi NRT — hanya pada waktu kompilasi, tanpa overhead runtime).
// Nullable value type (runtime Nullable<int>)
int? age = null;
bool hasValue = age.HasValue;
int value = age.GetValueOrDefault();
// Nullable reference type (compile-time annotation only)
string? name = null;
// string? has NO runtime wrapper — it's just a compile-time hint
// null check is still needed at runtime
if (name is not null)
Console.WriteLine(name.ToUpper());Menekan Peringatan dengan !
Operator null-forgiving (!) menekan peringatan nullable tertentu ketika Anda memiliki informasi yang lebih tepat daripada compiler. Gunakan seperlunya dan dokumentasikan alasan penggunaannya aman.
// Use ! when you know the value cannot be null
var user = _db.Users.FirstOrDefault(u => u.Email == email);
var name = user!.Name; // user is guaranteed by business logic
// EF Core navigation properties set by the framework:
public class Order
{
public Customer Customer { get; set; } = null!; // set by EF Core
}Dunia Nyata: Respons API Nullable
Pembungkus API yang field-nya mungkin ada atau tidak ada dalam respons JSON — anotasi nullable menyampaikan maksud dengan jelas.
#nullable enable
public class WeatherResponse
{
public string City { get; set; } = ""; // always present
public double Temperature { get; set; } // always present
public string? Description { get; set; } // optional field
public string? AlertMessage { get; set; } // only when there's an alert
}
// Consumer:
var weather = await api.GetWeatherAsync("London");
Console.WriteLine(weather.City); // safe
Console.WriteLine(weather.Description?.ToUpper() ?? "N/A"); // safe null-handlingPemeriksaan Singkat
Berapa overhead runtime Nullable Reference Types (string?) dibandingkan dengan tipe referensi biasa (string)?
Ringkasan: Mengaktifkan & Memahami NRT
Inti pembelajaran:
- Aktifkan secara global dengan
<Nullable>enable</Nullable>di .csproj string= tidak pernah null;string?= mungkin null- Analisis alur melacak state null melalui percabangan dan nilai yang dikembalikan
- Anotasi NRT hanya berlaku pada waktu kompilasi — tanpa overhead runtime
- CS8618: inisialisasi field non-nullable di konstruktor atau gunakan
= null!untuk ORM - Gunakan ! seperlunya — dokumentasikan alasan operator null-forgiving aman
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Mengaktifkan & Memahami NRT” gratis?
Ya — teks lengkap “Mengaktifkan & Memahami NRT” 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 “Mengaktifkan & Memahami NRT”?
Aktifkan konteks nullable, pahami tipe referensi nullable dan non-nullable, lalu baca peringatan compiler. 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 1 dari 4.
Berapa lama pelajaran “Mengaktifkan & Memahami NRT” 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
- Mengaktifkan & Memahami NRT
- Anotasi: ?, !, MaybeNull & NotNull
- Operator Null-Conditional & Null-Coalescing
- Memigrasikan Codebase ke NRT