CSHARP DOCS

DASAR-DASAR

Struktur Program (Top-level statements)
Description: Mulai C# 9, Anda bisa langsung menulis kode tanpa boilerplate namespace dan class Main.
Example:
Console.WriteLine("Halo Dunia");
Output: Halo Dunia
Namespace & using
Description: Mengorganisasi kode dan mengimpor pustaka. global using di C# 10 untuk using yang sering dipakai.
Example:
using System;
using System.Collections.Generic;
Output: Akses ke Console, List<T>, dll.
Komentar & Dokumentasi
Description: Komentar baris (//), blok (/* */), dan dokumentasi XML (///) untuk menghasilkan doc otomatis.
Example:
/// <summary>Menghitung pajak</summary>
/// <param name="amount">Jumlah</param>
/// <returns>Nilai pajak</returns>
Output: Dokumentasi API siap di-generate.

TIPE-DATA

Built-in Value Types (int, long, float, double, decimal, bool, char)
Description: Tipe nilai disimpan di stack. decimal untuk keuangan, double untuk saintifik.
Example:
int umur = 25;
decimal harga = 19.99m;
bool aktif = true;
Output: Variabel berisi nilai langsung.
Reference Types (string, object, dynamic, class, array, delegate, interface)
Description: Tipe referensi menyimpan alamat di heap. string immutable, object adalah base semua tipe.
Example:
string nama = "Ridho";
object obj = 123; // boxing
Output: Variabel menyimpan referensi ke data.
Nullable Value Types (int?, double?, bool?)
Description: Memungkinkan tipe nilai menerima null.
Example:
int? usia = null;
if (usia.HasValue) Console.WriteLine(usia.Value);
else Console.WriteLine("Tidak diketahui");
Output: Tidak diketahui
var (Implicit Typing)
Description: Kompiler menentukan tipe dari ekspresi kanan. Wajib diinisialisasi.
Example:
var pesan = "Halo";
var angka = 10;
var data = new List<string>();
Output: pesan: string, angka: int, data: List<string>
String Interpolation ($) & Verbatim (@)
Description: Menyisipkan ekspresi dalam string dengan $@ untuk string literal multi-baris.
Example:
string nama = "Ridho";
string path = @"C:\Users\Ridho\Docs";
Console.WriteLine($"Halo, {nama}! Path: {path}");
Output: Halo, Ridho! Path: C:\Users\Ridho\Docs

KONTROL-ALUR

if-else if-else
Description: Percabangan berdasarkan kondisi boolean.
Example:
if (skor >= 90) Console.WriteLine("A");
else if (skor >= 80) Console.WriteLine("B");
else Console.WriteLine("C");
Output: A, B, atau C
switch statement & switch expression (C# 8+)
Description: Percabangan multi-kasus. Ekspresi switch lebih ringkas.
Example:
string hari = "Senin";
string hasil = hari switch {
    "Senin" => "Awal pekan",
    "Sabtu" or "Minggu" => "Akhir pekan",
    _ => "Hari biasa"
};
Output: Awal pekan
for, while, do-while
Description: Perulangan dengan counter, kondisi di awal, atau kondisi di akhir.
Example:
for (int i=0; i<3; i++) Console.Write(i); // 012
while (x < 3) { x++; }
do { x++; } while (x < 3);
Output: 012
foreach
Description: Iterasi pada koleksi yang mengimplementasikan IEnumerable atau IEnumerable<T>.
Example:
var buah = new[] {"Apel", "Jeruk"};
foreach (var b in buah) Console.WriteLine(b);
Output: Apel Jeruk

OOP

Class, Object, Constructor
Description: Blueprint (class) dan instance (object) dengan new. Constructor untuk inisialisasi.
Example:
class Mobil {
    public string Warna;
    public Mobil(string warna) { Warna = warna; }
    public void Klakson() => Console.WriteLine("Beep!");
}

var m = new Mobil("Merah"); m.Klakson();
Output: Beep!
Properties (get; set; init;)
Description: Enkapsulasi field dengan properti. init hanya bisa diset saat inisialisasi.
Example:
class User {
    public string Name { get; set; }
    public DateTime Created { get; init; } = DateTime.Now;
}
Output: Name dapat diubah, Created hanya saat new.
Inheritance & base
Description: Mewarisi anggota dari kelas dasar. base untuk memanggil constructor dasar.
Example:
class Kendaraan { public int Kecepatan; }
class Motor : Kendaraan {
    public Motor(int kec) { Kecepatan = kec; }
    public string Tipe { get; set; }
}
Output: Motor memiliki Kecepatan dan Tipe.
Polymorphism (virtual, override, sealed)
Description: Method di kelas dasar dapat diganti di kelas turunan. sealed mencegah override lebih lanjut.
Example:
class Hewan { public virtual void Suara() => Console.WriteLine("Bunyi"); }
class Kucing : Hewan { public override void Suara() => Console.WriteLine("Meong"); }
Output: Meong
Abstract Class & Abstract Method
Description: Kelas yang tidak dapat diinstansiasi. Method abstrak wajib di-override.
Example:
abstract class Bentuk { public abstract double Luas(); }
class Persegi : Bentuk { double sisi; public override double Luas() => sisi*sisi; }
Output: Hanya bisa new Persegi().
Interface (C# 8+ default implementation)
Description: Kontrak method. Sejak C# 8 bisa memiliki implementasi default.
Example:
interface ILogger { void Log(string msg) => Console.WriteLine(msg); }
class ConsoleLogger : ILogger { }
Output: ConsoleLogger bisa langsung pakai Log.
Record (C# 9+) & Record struct (C# 10+)
Description: Tipe referensi immutable dengan value equality. with expression untuk membuat salinan.
Example:
record Person(string Name, int Age);
var p1 = new Person("Ridho", 25);
var p2 = p1 with { Age = 26 };
Output: p2 adalah salinan dengan Age 26, p1 tetap 25.

KOLEKSI

List<T>
Description: Koleksi dinamis generik. Method: Add, Remove, Insert, Count, Find.
Example:
var angka = new List<int> { 1, 2, 3 };
angka.Add(4);
Console.WriteLine(angka.Count); // 4
Output: 4
Dictionary<TKey, TValue>
Description: Pasangan kunci-nilai. Kunci harus unik.
Example:
var kamus = new Dictionary<string, int> { ["satu"] = 1, ["dua"] = 2 };
Console.WriteLine(kamus["satu"]);
Output: 1
HashSet<T>
Description: Koleksi nilai unik tanpa urutan.
Example:
var set = new HashSet<int> { 1, 2, 2, 3 };
Console.WriteLine(set.Count); // 3
Output: 3
Queue<T> / Stack<T>
Description: FIFO / LIFO.
Example:
var q = new Queue<int>(); q.Enqueue(1); q.Dequeue();
var s = new Stack<int>(); s.Push(1); s.Pop();
Output: 1

LINQ

Query Syntax (from ... in ... where ... orderby ... select)
Description: Menulis query LINQ seperti SQL.
Example:
var data = new[] { 1, 2, 3, 4 };
var genap = from n in data where n % 2 == 0 orderby n descending select n;
Output: 4, 2
Method Syntax (.Where, .Select, .OrderBy, .GroupBy, .Join, .Aggregate)
Description: Menggunakan extension methods dan lambda expression.
Example:
var hasil = data.Where(n => n > 2).Select(n => n * 10);
Output: 30, 40
Deferred Execution & Immediate Execution
Description: Query LINQ dieksekusi saat diiterasi (deferred) atau saat memanggil .ToList() / .Count().
Example:
var query = data.Where(n => n > 2); // deferred
var list = query.ToList(); // immediate
Output: list = [3,4]

ASYNC-PROGRAMMING

async / await
Description: Menulis kode asinkron yang mudah dibaca. Mengembalikan Task, Task<T>, atau void (hanya event).
Example:
async Task<string> DownloadAsync() {
    using HttpClient client = new();
    string hasil = await client.GetStringAsync("https://example.com");
    return hasil;
}
Output: Menunggu tanpa memblokir thread.
Task.Run & Task.WhenAll / WhenAny
Description: Menjalankan pekerjaan di thread pool, menjalankan banyak task paralel.
Example:
var task1 = Task.Run(() => DoWork());
var task2 = Task.Run(() => DoOtherWork());
await Task.WhenAll(task1, task2);
Output: Keduanya selesai baru lanjut.
CancellationToken
Description: Membatalkan operasi asinkron.
Example:
var cts = new CancellationTokenSource();
var task = DownloadAsync(cts.Token);
cts.Cancel(); // batalkan
Output: Task berhenti dengan OperationCanceledException.

ERROR-HANDLING

try-catch-finally
Description: Menangani exception. finally selalu dijalankan.
Example:
try { int x = 0; int y = 5 / x; }
catch (DivideByZeroException ex) { Console.WriteLine(ex.Message); }
finally { Console.WriteLine("Selesai"); }
Output: Attempted to divide by zero. Selesai
Exception Filters (when)
Description: Menambahkan kondisi pada catch.
Example:
catch (HttpRequestException ex) when (ex.StatusCode == HttpStatusCode.NotFound) { ... }
Output: Hanya menangkap 404.
Custom Exception
Description: Membuat exception sendiri.
Example:
class MyException : Exception {
    public MyException(string msg) : base(msg) { }
}
throw new MyException("Pesan kustom");
Output: Exception dilempar dengan pesan kustom.

BEST-PRACTICES

Dependency Injection (DI)
Description: Gunakan interface dan constructor injection untuk decoupling. Daftarkan di ServiceCollection.
Example:
services.AddScoped<IMyService, MyService>();
class Consumer { public Consumer(IMyService svc) { } }
Output: Komponen mudah diganti dan diuji.
Gunakan IHttpClientFactory
Description: Menghindari socket exhaustion dan pengelolaan koneksi HttpClient.
Example:
services.AddHttpClient();
class Service { public Service(HttpClient client) { } }
Output: HttpClient dikelola dengan baik.
Gunakan nameof() dan nameof(Class.Property)
Description: Refactor-safe, menghindari string literal.
Example:
Console.WriteLine(nameof(user.Name));
throw new ArgumentNullException(nameof(param));
Output: "Name", "param"
Nullable Reference Types (NRT) - enable di .csproj
Description: Mencegah NullReferenceException dengan compile-time warnings.
Example:
<Nullable>enable</Nullable>
string? mungkinNull = null;
string pasti = mungkinNull ?? "default";
Output: Kode lebih aman dari null.