Episode ini mengajarkan fondasi bahasa C#: tipe data primitif, deklarasi variabel, value dan reference types, nullable, control flow, pattern matching, serta fungsi dan lambda. Semua contoh berjalan langsung di aplikasi console.

Project pertama sudah berjalan di episode 3. Sekarang kalian masuk ke bahasa yang menggerakkan semuanya: C#. Episode 4 mengajarkan fondasi bahasa — tipe data, variabel, control flow, fungsi, dan lambda. Ini adalah perangkat yang akan kalian pakai di setiap baris kode .NET selanjutnya.
C# adalah bahasa modern yang terus berevolusi. Alih-alih menghafal sintaks, fokuslah pada konsep: value type versus reference type, nullable, dan pattern matching. Ketiganya menentukan cara kalian memodelkan data dan menulis logika yang aman.
Tipe primitif C# adalah alias untuk tipe di System namespace: int untuk integer, double untuk pecahan, decimal untuk uang, bool untuk boolean, char dan string untuk teks. Contoh deklarasi:
int jumlah = 42;
double harga = 19.99;
decimal total = 99.99m;
bool aktif = true;
string nama = "Arman";decimal total = 99.99m memakai suffix m agar ditafsirkan sebagai decimal, bukan double. Pemilihan tipe penting: untuk perhitungan uang, decimal menghindari error pembulatan floating-point.
Kata kunci var meminta compiler menyimpulkan tipe dari nilai di sisi kanan:
var jumlah = 42;
var pesan = "Halo";var jumlah = 42 disimpulkan sebagai int. var bukan tipe dinamis — tipe ditentukan saat kompilasi. Gunakan saat tipe sudah jelas dari sisi kanan untuk membuat kode lebih ringkas.
Value type menyimpan nilai secara langsung di stack — contohnya int, double, dan struct. Reference type menyimpan referensi ke objek di heap — contohnya class, string, dan array. Perbedaan ini menentukan perilaku saat assignment dan parameter diteruskan.
Enum mendefinisikan sekumpulan konstanta bernama, dan nullable menandakan bahwa nilai bisa kosong:
enum StatusPembayaran { Pending, Sukses, Gagal }
StatusPembayaran status = StatusPembayaran.Sukses;
int? umur = null;int? umur = null menandai tipe nullable — variabel bisa berisi angka atau null. Sejak .NET 6, Nullable enable membuat compiler memperingatkan saat reference type berpotensi null, sehingga bug null terdeteksi lebih awal.
Struktur kontrol C# mirip bahasa modern lainnya:
if (status == StatusPembayaran.Sukses)
{
Console.WriteLine("Pembayaran diterima");
}
else
{
Console.WriteLine("Pembayaran gagal");
}
for (int i = 0; i < 3; i++)
{
Console.WriteLine(i);
}if, for, while, dan foreach bekerja seperti yang kalian kenal. Blok kurung kurawal wajib dibuka dan ditutup — dan karena top-level statements dipakai, kode ini langsung bisa dijalankan dalam satu file Program.cs.
C# modern menggantikan banyak if-else dengan pattern matching. Switch expression memetakan nilai secara ringkas dan type-safe:
string label = status switch
{
StatusPembayaran.Sukses => "OK",
StatusPembayaran.Gagal => "ERR",
_ => "PENDING"
};switch expression di atas mengevaluasi tiap pola dan mengembalikan nilai. Pola _ (discard) menangani semua kasus lain. Kombinasi switch expression dengan record type (episode 5) menghasilkan kode yang sangat ekspresif.
Fungsi di C# disebut method. Method bisa dideklarasikan di dalam method lain — disebut local function:
int Tambah(int a, int b)
{
return a + b;
}
int LipatGanda(int nilai) => nilai * 2;
Console.WriteLine(Tambah(3, 4));
Console.WriteLine(LipatGanda(5));Tambah adalah method biasa dengan blok tubuh, sedangkan LipatGanda memakai expression body (=>) untuk fungsi satu baris. Keduanya sama-sama valid; pilih expression body saat tubuh fungsi cukup ringkas.
Lambda adalah fungsi anonim yang banyak dipakai bersama LINQ dan koleksi. Contohnya dengan List<T>.FindAll:
var angka = new List<int> { 1, 2, 3, 4, 5 };
var genap = angka.Where(x => x % 2 == 0).ToList();
foreach (var n in genap)
{
Console.WriteLine(n);
}angka.Where(x => x % 2 == 0) memakai lambda untuk menyaring elemen genap. Method seperti Where dan Select adalah jantung LINQ yang akan kita pakai masif saat akses data di episode 9.
Tip
Biasakan memakai foreach daripada index loop, dan lambda untuk transformasi koleksi. Ini mengurangi bug dan membuat niat kode lebih jelas.
Beberapa jebakan yang sering terjadi:
== membandingkan nilai, bukan referensi — aman untuk string.int versus int? tidak bisa dicampur tanpa pengecekan null.switch expression harus menangani semua kemungkinan atau memakai discard _.Inti yang harus dibawa pulang:
decimal untuk uang.var untuk inferensi; tipe ditentukan saat kompilasi.Di episode 5 selanjutnya kita akan membahas OOP dan core programming concepts — class, properties, encapsulation, inheritance, polymorphism, interface, record types, dan tuple. Di sinilah kalian mulai memodelkan domain aplikasi dengan C#.