CSHARP DOCS
DASAR-DASAR
Name
Description
Example
Output
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
Struktur Program (Top-level statements)Mulai C# 9, Anda bisa langsung menulis kode tanpa boilerplate namespace dan class Main.
Console.WriteLine("Halo Dunia");Halo Dunia
Namespace & usingDescription: 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.
Namespace & usingMengorganisasi kode dan mengimpor pustaka. global using di C# 10 untuk using yang sering dipakai.
using System; using System.Collections.Generic;
Akses ke Console, List<T>, dll.
Komentar & DokumentasiDescription: 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.
Komentar & DokumentasiKomentar baris (//), blok (/* */), dan dokumentasi XML (///) untuk menghasilkan doc otomatis.
/// <summary>Menghitung pajak</summary> /// <param name="amount">Jumlah</param> /// <returns>Nilai pajak</returns>
Dokumentasi API siap di-generate.
TIPE-DATA
Name
Description
Example
Output
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.
Built-in Value Types (int, long, float, double, decimal, bool, char)Tipe nilai disimpan di stack. decimal untuk keuangan, double untuk saintifik.
int umur = 25; decimal harga = 19.99m; bool aktif = true;
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.
Reference Types (string, object, dynamic, class, array, delegate, interface)Tipe referensi menyimpan alamat di heap. string immutable, object adalah base semua tipe.
string nama = "Ridho"; object obj = 123; // boxing
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
Nullable Value Types (int?, double?, bool?)Memungkinkan tipe nilai menerima null.
int? usia = null;
if (usia.HasValue) Console.WriteLine(usia.Value);
else Console.WriteLine("Tidak diketahui");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>
var (Implicit Typing)Kompiler menentukan tipe dari ekspresi kanan. Wajib diinisialisasi.
var pesan = "Halo"; var angka = 10; var data = new List<string>();
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
String Interpolation ($) & Verbatim (@)Menyisipkan ekspresi dalam string dengan $@ untuk string literal multi-baris.
string nama = "Ridho";
string path = @"C:\Users\Ridho\Docs";
Console.WriteLine($"Halo, {nama}! Path: {path}");Halo, Ridho! Path: C:\Users\Ridho\Docs
KONTROL-ALUR
Name
Description
Example
Output
if-else if-elseDescription: 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
if-else if-elsePercabangan berdasarkan kondisi boolean.
if (skor >= 90) Console.WriteLine("A");
else if (skor >= 80) Console.WriteLine("B");
else Console.WriteLine("C");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
switch statement & switch expression (C# 8+)Percabangan multi-kasus. Ekspresi switch lebih ringkas.
string hari = "Senin";
string hasil = hari switch {
"Senin" => "Awal pekan",
"Sabtu" or "Minggu" => "Akhir pekan",
_ => "Hari biasa"
};Awal pekan
for, while, do-whileDescription: 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
for, while, do-whilePerulangan dengan counter, kondisi di awal, atau kondisi di akhir.
for (int i=0; i<3; i++) Console.Write(i); // 012
while (x < 3) { x++; }
do { x++; } while (x < 3);012
foreachDescription: 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
foreachIterasi pada koleksi yang mengimplementasikan IEnumerable atau IEnumerable<T>.
var buah = new[] {"Apel", "Jeruk"};
foreach (var b in buah) Console.WriteLine(b);Apel
Jeruk
OOP
Name
Description
Example
Output
Class, Object, ConstructorDescription: 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!
Class, Object, ConstructorBlueprint (class) dan instance (object) dengan new. Constructor untuk inisialisasi.
class Mobil {
public string Warna;
public Mobil(string warna) { Warna = warna; }
public void Klakson() => Console.WriteLine("Beep!");
}
var m = new Mobil("Merah"); m.Klakson();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.
Properties (get; set; init;)Enkapsulasi field dengan properti. init hanya bisa diset saat inisialisasi.
class User {
public string Name { get; set; }
public DateTime Created { get; init; } = DateTime.Now;
}Name dapat diubah, Created hanya saat new.
Inheritance & baseDescription: 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.
Inheritance & baseMewarisi anggota dari kelas dasar. base untuk memanggil constructor dasar.
class Kendaraan { public int Kecepatan; }
class Motor : Kendaraan {
public Motor(int kec) { Kecepatan = kec; }
public string Tipe { get; set; }
}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
Polymorphism (virtual, override, sealed)Method di kelas dasar dapat diganti di kelas turunan. sealed mencegah override lebih lanjut.
class Hewan { public virtual void Suara() => Console.WriteLine("Bunyi"); }
class Kucing : Hewan { public override void Suara() => Console.WriteLine("Meong"); }Meong
Abstract Class & Abstract MethodDescription: 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().
Abstract Class & Abstract MethodKelas yang tidak dapat diinstansiasi. Method abstrak wajib di-override.
abstract class Bentuk { public abstract double Luas(); }
class Persegi : Bentuk { double sisi; public override double Luas() => sisi*sisi; }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.
Interface (C# 8+ default implementation)Kontrak method. Sejak C# 8 bisa memiliki implementasi default.
interface ILogger { void Log(string msg) => Console.WriteLine(msg); }
class ConsoleLogger : ILogger { }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.
Record (C# 9+) & Record struct (C# 10+)Tipe referensi immutable dengan value equality. with expression untuk membuat salinan.
record Person(string Name, int Age);
var p1 = new Person("Ridho", 25);
var p2 = p1 with { Age = 26 };p2 adalah salinan dengan Age 26, p1 tetap 25.
KOLEKSI
Name
Description
Example
Output
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); // 4Output: 4
List<T>Koleksi dinamis generik. Method: Add, Remove, Insert, Count, Find.
var angka = new List<int> { 1, 2, 3 };
angka.Add(4);
Console.WriteLine(angka.Count); // 44
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
Dictionary<TKey, TValue>Pasangan kunci-nilai. Kunci harus unik.
var kamus = new Dictionary<string, int> { ["satu"] = 1, ["dua"] = 2 };
Console.WriteLine(kamus["satu"]);1
HashSet<T>Description: Koleksi nilai unik tanpa urutan.
Example:
var set = new HashSet<int> { 1, 2, 2, 3 };
Console.WriteLine(set.Count); // 3Output: 3
HashSet<T>Koleksi nilai unik tanpa urutan.
var set = new HashSet<int> { 1, 2, 2, 3 };
Console.WriteLine(set.Count); // 33
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
Queue<T> / Stack<T>FIFO / LIFO.
var q = new Queue<int>(); q.Enqueue(1); q.Dequeue(); var s = new Stack<int>(); s.Push(1); s.Pop();
1
LINQ
Name
Description
Example
Output
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
Query Syntax (from ... in ... where ... orderby ... select)Menulis query LINQ seperti SQL.
var data = new[] { 1, 2, 3, 4 };
var genap = from n in data where n % 2 == 0 orderby n descending select n;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
Method Syntax (.Where, .Select, .OrderBy, .GroupBy, .Join, .Aggregate)Menggunakan extension methods dan lambda expression.
var hasil = data.Where(n => n > 2).Select(n => n * 10);
30, 40
Deferred Execution & Immediate ExecutionDescription: 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]
Deferred Execution & Immediate ExecutionQuery LINQ dieksekusi saat diiterasi (deferred) atau saat memanggil .ToList() / .Count().
var query = data.Where(n => n > 2); // deferred var list = query.ToList(); // immediate
list = [3,4]
ASYNC-PROGRAMMING
Name
Description
Example
Output
async / awaitDescription: 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.
async / awaitMenulis kode asinkron yang mudah dibaca. Mengembalikan Task, Task<T>, atau void (hanya event).
async Task<string> DownloadAsync() {
using HttpClient client = new();
string hasil = await client.GetStringAsync("https://example.com");
return hasil;
}Menunggu tanpa memblokir thread.
Task.Run & Task.WhenAll / WhenAnyDescription: 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.
Task.Run & Task.WhenAll / WhenAnyMenjalankan pekerjaan di thread pool, menjalankan banyak task paralel.
var task1 = Task.Run(() => DoWork()); var task2 = Task.Run(() => DoOtherWork()); await Task.WhenAll(task1, task2);
Keduanya selesai baru lanjut.
CancellationTokenDescription: Membatalkan operasi asinkron.
Example:
var cts = new CancellationTokenSource(); var task = DownloadAsync(cts.Token); cts.Cancel(); // batalkan
Output: Task berhenti dengan OperationCanceledException.
CancellationTokenMembatalkan operasi asinkron.
var cts = new CancellationTokenSource(); var task = DownloadAsync(cts.Token); cts.Cancel(); // batalkan
Task berhenti dengan OperationCanceledException.
ERROR-HANDLING
Name
Description
Example
Output
try-catch-finallyDescription: 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
try-catch-finallyMenangani exception. finally selalu dijalankan.
try { int x = 0; int y = 5 / x; }
catch (DivideByZeroException ex) { Console.WriteLine(ex.Message); }
finally { Console.WriteLine("Selesai"); }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.
Exception Filters (when)Menambahkan kondisi pada catch.
catch (HttpRequestException ex) when (ex.StatusCode == HttpStatusCode.NotFound) { ... }Hanya menangkap 404.
Custom ExceptionDescription: Membuat exception sendiri.
Example:
class MyException : Exception {
public MyException(string msg) : base(msg) { }
}
throw new MyException("Pesan kustom");Output: Exception dilempar dengan pesan kustom.
Custom ExceptionMembuat exception sendiri.
class MyException : Exception {
public MyException(string msg) : base(msg) { }
}
throw new MyException("Pesan kustom");Exception dilempar dengan pesan kustom.
BEST-PRACTICES
Name
Description
Example
Output
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.
Dependency Injection (DI)Gunakan interface dan constructor injection untuk decoupling. Daftarkan di ServiceCollection.
services.AddScoped<IMyService, MyService>();
class Consumer { public Consumer(IMyService svc) { } }Komponen mudah diganti dan diuji.
Gunakan IHttpClientFactoryDescription: Menghindari socket exhaustion dan pengelolaan koneksi HttpClient.
Example:
services.AddHttpClient();
class Service { public Service(HttpClient client) { } }Output: HttpClient dikelola dengan baik.
Gunakan IHttpClientFactoryMenghindari socket exhaustion dan pengelolaan koneksi HttpClient.
services.AddHttpClient();
class Service { public Service(HttpClient client) { } }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"
Gunakan nameof() dan nameof(Class.Property)Refactor-safe, menghindari string literal.
Console.WriteLine(nameof(user.Name)); throw new ArgumentNullException(nameof(param));
"Name", "param"
Nullable Reference Types (NRT) - enable di .csprojDescription: Mencegah NullReferenceException dengan compile-time warnings.
Example:
<Nullable>enable</Nullable> string? mungkinNull = null; string pasti = mungkinNull ?? "default";
Output: Kode lebih aman dari null.
Nullable Reference Types (NRT) - enable di .csprojMencegah NullReferenceException dengan compile-time warnings.
<Nullable>enable</Nullable> string? mungkinNull = null; string pasti = mungkinNull ?? "default";
Kode lebih aman dari null.