C# dan .NET dari Nol hingga 100 Contoh: Tipe, Property, Class, LINQ, Async, dan Exception
C# adalah bahasa modern untuk membangun aplikasi Windows, layanan web, game, dan sistem cloud di atas .NET. Artikel ini dibangun dari program satu baris sampai 100 contoh yang bisa dijalankan. Anda akan mempelajari variabel dan operator, keputusan dan pattern matching, perulangan, method, array dan list, string, class dan objek, setiap jenis property, pewarisan dan interface, record dan enum, koleksi dengan LINQ, generics, delegate, kode async, dan exception. Setiap contoh sudah dikompilasi dan dijalankan di .NET 8, dan keluaran sebenarnya ditampilkan setelah kodenya.
Yang Anda butuhkan
Pasang .NET 8 SDK (atau yang lebih baru) dari situs Microsoft, lalu periksa dengan dotnet --version. Editor teks apa pun bisa dipakai, dan Visual Studio Code dengan C# Dev Kit adalah pilihan gratis yang baik. Tidak diperlukan pengalaman pemrograman, tetapi contoh pertama mengandaikan Anda tahu apa itu angka dan kata.
Cara menjalankan sebuah contoh
Buat proyek konsol dengan dotnet new console -o demo, ganti berkas Program.cs dengan kode contoh, lalu jalankan dotnet run di dalam folder proyek. Keluaran yang ditampilkan dalam artikel berasal dari proses yang benar-benar dijalankan di .NET 8.
Ilustrasi
Topik 1: Halo, variabel, dan tipe
Setiap program C# dimulai dengan pernyataan yang berjalan dari atas ke bawah. Contoh-contoh ini menunjukkan cara mencetak teks, menyimpan nilai dalam variabel, dan memilih tipe yang tepat untuk setiap nilai.
Pernyataan top-level dan keluaran
C# modern memungkinkan sebuah berkas berisi pernyataan secara langsung, tanpa class atau method Main. Console.WriteLine mencetak satu baris; Console.Write tetap di baris yang sama. $"..." adalah string interpolasi, yang menempatkan variabel di dalam teks dengan kurung kurawal.
Tipe nilai dan rentangnya
int menyimpan bilangan bulat sekitar plus atau minus 2 miliar, long menyimpan bilangan yang jauh lebih besar, dan byte menampung 0 sampai 255. double dan float menyimpan desimal dengan presisi terbatas, jadi 0.1 + 0.2 tidak tepat sama dengan 0.3. decimal menyimpan hingga 28 digit signifikan secara tepat, itulah sebabnya decimal menjadi pilihan umum untuk uang.
var, const, dan konstanta
var meminta kompiler menyimpulkan tipe dari nilainya, sehingga var n = 10; tetaplah int. const membuat nilai yang tetap saat kompilasi. Tipe eksplisit membuat kode lebih mudah dibaca dalam program yang besar, dan var membuatnya lebih pendek ketika tipenya sudah jelas.
Contoh 1: Halo dunia
Cetak satu baris teks ke konsol.
Console.WriteLine("Hello, C#!");
Keluaran:
Hello, C#!
Contoh 2: Write dan WriteLine
Write tetap di baris yang sama; WriteLine pindah ke baris berikutnya.
Console.Write("Hello, ");
Console.WriteLine("world!");
Console.WriteLine("Two lines");
Keluaran:
Hello, world!
Two lines
Contoh 3: var dan tipe eksplisit
Deklarasikan variabel dengan tipe, atau biarkan kompiler menyimpulkannya dengan var.
int count = 3;
var name = "Ada";
Console.WriteLine($"{name} has {count} items");
Keluaran:
Ada has 3 items
Contoh 4: Tipe bilangan bulat
int, long, dan byte menyimpan rentang bilangan bulat yang berbeda.
int a = 2_000_000_000;
long b = 9_000_000_000L;
byte c = 255;
Console.WriteLine($"{a} {b} {c}");
Console.WriteLine(int.MaxValue);
Keluaran:
2000000000 9000000000 255
2147483647
Contoh 5: Tipe bilangan desimal
double dan float menyimpan desimal dengan presisi terbatas.
double d = 3.14159;
float f = 2.5f;
Console.WriteLine(d * 2);
Console.WriteLine(f / 2);
Keluaran:
6.28318
1.25
Contoh 6: decimal untuk uang
decimal menyimpan digit desimal secara tepat, cocok untuk uang.
decimal price = 19.99m;
decimal total = price * 3;
Console.WriteLine($"Total: {total}");
Keluaran:
Total: 59.97
Contoh 7: bool
true dan false, dikombinasikan dengan && dan !.
bool isOpen = true;
bool isLate = false;
Console.WriteLine(isOpen && !isLate);
Keluaran:
True
Contoh 8: char
Satu karakter yang kodenya bisa dibaca dengan konversi ke int.
char letter = 'A';
char next = (char)(letter + 1);
Console.WriteLine($"{letter} {next} {(int)letter}");
Keluaran:
A B 65
Contoh 9: const
Nilai yang ditetapkan saat kompilasi.
const double Pi = 3.14159;
Console.WriteLine($"Area of unit circle: {Pi}");
Keluaran:
Area of unit circle: 3.14159
Contoh 10: Perataan dan format
Beri padding pada teks dan angka di dalam string interpolasi.
string item = "Coffee";
decimal price = 45.5m;
Console.WriteLine($"{item,-10}|{price,8:F2}");
Keluaran:
Coffee | 45.50
Topik 2: Operator dan konversi
Operator menggabungkan nilai. Mengonversi antartipe adalah tugas yang umum, dan C# menyediakan cara yang aman dan cara yang tidak aman untuk melakukannya.
Aritmetika dan pembagian bilangan bulat
+, -, *, / dan % bekerja seperti yang diharapkan, tetapi membagi dua int akan membuang pecahannya: 7 / 2 hasilnya 3. Tulis 7.0 / 2 atau ubah salah satu operand menjadi double untuk mempertahankan bagian desimal. ++ dan -- mengubah variabel sebelum atau sesudah nilainya dipakai, bergantung pada posisinya.
Perbandingan, logika, dan bit
== dan != membandingkan nilai, dan && serta || menggabungkan kondisi dengan evaluasi short-circuit. Operator bitwise seperti & dan | bekerja pada bit individual, dan << menggeser bit, yang merupakan cara cepat untuk mengalikan dengan pangkat dua.
Casting, Parse, dan TryParse
Cast (int) memotong desimal alih-alih membulatkannya. Convert.ToInt32 dan Math.Round memakai aturan pembulatan yang berbeda. int.Parse melempar exception ketika input salah, sedangkan int.TryParse mengembalikan false, jadi TryParse adalah pilihan yang lebih aman untuk input pengguna.
Contoh 11: Aritmetika
+, -, *, / dan % pada bilangan bulat.
int a = 17, b = 5;
Console.WriteLine(a + b);
Console.WriteLine(a - b);
Console.WriteLine(a * b);
Console.WriteLine(a / b);
Console.WriteLine(a % b);
Keluaran:
22
12
85
3
2
Contoh 12: Pembagian bilangan bulat
Membagi dua int membuang pecahannya.
Console.WriteLine(7 / 2);
Console.WriteLine(7.0 / 2);
Console.WriteLine((double)7 / 2);
Keluaran:
3
3.5
3.5
Contoh 13: Increment
++ sebelum atau sesudah variabel mengubah nilainya pada waktu yang berbeda.
int n = 5;
Console.WriteLine(n++);
Console.WriteLine(++n);
Console.WriteLine(n);
Keluaran:
5
7
7
Contoh 14: Assignment majemuk
+=, *=, dan -= memperbarui variabel dalam satu langkah.
int score = 10;
score += 5;
score *= 2;
score -= 4;
Console.WriteLine(score);
Keluaran:
26
Contoh 15: Perbandingan
==, != dan >= menghasilkan true atau false.
int x = 4;
Console.WriteLine(x == 4);
Console.WriteLine(x != 4);
Console.WriteLine(x >= 5);
Keluaran:
True
False
False
Contoh 16: Operator logika
&&, || dan ! menggabungkan kondisi.
bool hasTicket = true;
bool isAdult = false;
Console.WriteLine(hasTicket && isAdult);
Console.WriteLine(hasTicket || isAdult);
Console.WriteLine(!hasTicket);
Keluaran:
False
True
False
Contoh 17: Operator bitwise dan shift
&, | dan << bekerja pada bit individual.
int flags = 0b0101;
Console.WriteLine(flags & 0b0100);
Console.WriteLine(flags | 0b0010);
Console.WriteLine(1 << 3);
Keluaran:
4
7
8
Contoh 18: Casting dan Convert
(int) memotong; Math.Round membulatkan sebelum konversi.
double price = 9.99;
int whole = (int)price;
int rounded = Convert.ToInt32(Math.Round(price));
Console.WriteLine($"{whole} {rounded}");
Keluaran:
9 10
Contoh 19: Parse dan TryParse
Ubah teks menjadi angka dengan aman menggunakan TryParse.
int a = int.Parse("42");
bool ok = int.TryParse("4x2", out int b);
Console.WriteLine($"{a} {ok} {b}");
Keluaran:
42 False 0
Contoh 20: ?? dan operator kondisional
?? memberi nilai default untuk null; ?: memilih salah satu dari dua nilai.
string? nickname = null;
string shown = nickname ?? "Guest";
int age = 20;
Console.WriteLine($"{shown} {(age >= 18 ? "adult" : "minor")}");
Keluaran:
Guest adult
Topik 3: Keputusan dan pattern matching
Program memilih jalur dengan if, switch, dan pattern. Pattern modern di C# memungkinkan Anda menguji bentuk dan nilai dalam satu ekspresi yang mudah dibaca.
if dan pernyataan switch
if, else if, dan else menguji kondisi dari atas ke bawah. Pernyataan switch memilih case berdasarkan nilai, dan setiap case memerlukan break atau return, sehingga eksekusi tidak jatuh ke case berikutnya secara tidak sengaja.
Ekspresi switch
Ekspresi switch mengembalikan nilai dan memakai => untuk setiap cabang. Cabang _ adalah discard pattern, yang menangani semua yang tidak cocok di atasnya. Kompiler memberi peringatan jika sebuah cabang tidak pernah bisa dicapai.
Pattern: relasional, tipe, properti, dan tuple
Pattern relasional seperti >= 80 mencocokkan rentang. Pattern tipe menguji tipe saat runtime dan bisa menambahkan kondisi when. Pattern properti mencocokkan field di dalam objek, seperti Total: > 100, dan pattern tuple mencocokkan beberapa nilai sekaligus.
Contoh 21: if, else if, dan else
Pilih satu cabang dari beberapa kondisi.
int temp = 31;
if (temp > 35) Console.WriteLine("Hot");
else if (temp > 25) Console.WriteLine("Warm");
else Console.WriteLine("Cool");
Keluaran:
Warm
Contoh 22: Pernyataan switch
Pilih case berdasarkan nilai; break mengakhiri setiap case.
string day = "Sat";
switch (day)
{
case "Sat":
case "Sun":
Console.WriteLine("Weekend");
break;
default:
Console.WriteLine("Weekday");
break;
}
Keluaran:
Weekend
Contoh 23: Ekspresi switch
Kembalikan nilai langsung dari switch.
int code = 2;
string label = code switch
{
1 => "Draft",
2 => "Published",
_ => "Unknown"
};
Console.WriteLine(label);
Keluaran:
Published
Contoh 24: Pattern relasional
Cocokkan rentang dengan pattern >= atau <=.
int score = 73;
string grade = score switch
{
>= 80 => "A",
>= 70 => "B",
_ => "C"
};
Console.WriteLine(grade);
Keluaran:
B
Contoh 25: Pattern tipe dengan when
Cocokkan tipe dan tambahkan kondisi dengan when.
object item = 42;
string kind = item switch
{
int n when n > 10 => $"big int {n}",
int n => $"small int {n}",
string s => $"text {s}",
_ => "other"
};
Console.WriteLine(kind);
Keluaran:
big int 42
Contoh 26: Pattern is
Uji tipe dan deklarasikan variabel dalam satu langkah.
object value = "hello";
if (value is string text)
{
Console.WriteLine($"Length {text.Length}");
}
Keluaran:
Length 5
Contoh 27: Pattern properti
Cocokkan properti sebuah objek.
var order = new { Status = "Paid", Total = 120 };
if (order is { Status: "Paid", Total: > 100 })
Console.WriteLine("Large paid order");
Keluaran:
Large paid order
Contoh 28: Pattern tuple
Cocokkan dua nilai sekaligus.
int a = 3, b = 0;
string result = (a, b) switch
{
(0, 0) => "origin",
(_, 0) => "on x axis",
_ => "elsewhere"
};
Console.WriteLine(result);
Keluaran:
on x axis
Contoh 29: Pemeriksaan null
is null dan ??= menangani nilai yang hilang.
string? name = null;
if (name is null) Console.WriteLine("No name");
name ??= "Guest";
Console.WriteLine(name);
Keluaran:
No name
Guest
Contoh 30: if bersarang
Satu if di dalam if lain memeriksa kondisi kedua.
int age = 25;
bool hasLicence = true;
if (age >= 18)
{
if (hasLicence) Console.WriteLine("May drive");
}
Keluaran:
May drive
Topik 4: Perulangan
Perulangan mengulang kode. Pilih perulangan yang sesuai dengan pekerjaannya: for ketika jumlahnya sudah diketahui, while ketika sebuah kondisi menentukan, dan foreach untuk mengunjungi setiap item.
for, while, dan do-while
for memiliki tiga bagian: awal, kondisi, dan langkah. while memeriksa sebelum setiap putaran, sehingga bisa berjalan nol kali. do-while berjalan setidaknya sekali lalu memeriksa kondisinya.
foreach, break, dan continue
foreach mengunjungi setiap item dalam array atau koleksi tanpa indeks. break keluar dari perulangan seketika, dan continue melompat ke pengulangan berikutnya. Gunakan keduanya untuk menjaga perulangan tetap pendek dan mudah dibaca.
Perulangan bersarang dan iterator
Perulangan di dalam perulangan lain membangun tabel atau grid. yield return menghasilkan nilai satu per satu dari sebuah method, sehingga pemanggil bisa membaca urutan yang panjang tanpa membangun seluruh list di memori.
Contoh 31: Perulangan for
Jalankan kode sejumlah kali yang sudah diketahui.
for (int i = 1; i <= 5; i++)
{
Console.Write(i + " ");
}
Console.WriteLine();
Keluaran:
1 2 3 4 5
Contoh 32: Perulangan while
Ulangi selama sebuah kondisi bernilai benar.
int countdown = 3;
while (countdown > 0)
{
Console.WriteLine($"T-{countdown}");
countdown--;
}
Keluaran:
T-3
T-2
T-1
Contoh 33: Perulangan do-while
Jalankan badan perulangan dulu, lalu periksa kondisinya.
int attempts = 0;
do
{
attempts++;
} while (attempts < 0);
Console.WriteLine($"Ran {attempts} time(s)");
Keluaran:
Ran 1 time(s)
Contoh 34: Perulangan foreach
Kunjungi setiap item dalam koleksi.
string[] fruits = { "apple", "banana", "cherry" };
foreach (string fruit in fruits)
{
Console.WriteLine(fruit.ToUpper());
}
Keluaran:
APPLE
BANANA
CHERRY
Contoh 35: break
Keluar dari perulangan seketika.
for (int i = 0; i < 10; i++)
{
if (i == 4) break;
Console.WriteLine(i);
}
Keluaran:
0
1
2
3
Contoh 36: continue
Lompat ke pengulangan berikutnya.
for (int i = 1; i <= 6; i++)
{
if (i % 2 == 0) continue;
Console.WriteLine(i);
}
Keluaran:
1
3
5
Contoh 37: Perulangan bersarang
Perulangan di dalam perulangan membangun sebuah tabel.
for (int row = 1; row <= 3; row++)
{
for (int col = 1; col <= 3; col++)
{
Console.Write($"{row * col,3}");
}
Console.WriteLine();
}
Keluaran:
1 2 3
2 4 6
3 6 9
Contoh 38: yield return
Hasilkan nilai satu per satu dengan iterator.
foreach (int n in Evens(10))
{
Console.WriteLine(n);
}
static IEnumerable<int> Evens(int max)
{
for (int i = 0; i <= max; i += 2)
{
yield return i;
}
}
Keluaran:
0
2
4
6
8
10
Topik 5: Method
Method adalah blok bernama yang menerima input dan bisa mengembalikan hasil. Method yang baik melakukan satu pekerjaan dan memiliki nama yang jelas.
Parameter, nilai kembali, dan void
Deklarasikan tipe setiap parameter dan tipe kembaliannya. void berarti method tidak mengembalikan apa pun. Parameter opsional memiliki nilai default, dan argumen bernama seperti tax: 0.2 membuat pemanggilan mudah dibaca.
ref, out, dan params
Parameter nilai menerima salinan. ref meneruskan variabelnya sendiri sehingga method bisa mengubahnya. out mengembalikan nilai tambahan, dan TryParse memakai pola ini. params menerima sejumlah argumen berapa pun.
Overloading dan fungsi lokal
Method bisa memakai nama yang sama ketika tipe parameternya berbeda, dan kompiler memilih yang tepat. Fungsi lokal dideklarasikan di dalam method lain dan berguna untuk pembantu kecil yang hanya dibutuhkan method itu.
Contoh 39: Method dengan nilai kembali
Method menerima input dan mengembalikan hasil.
Console.WriteLine(Add(4, 5));
static int Add(int a, int b)
{
return a + b;
}
Keluaran:
9
Contoh 40: Method void
Method yang melakukan pekerjaan dan tidak mengembalikan apa pun.
Greet("Ploy");
static void Greet(string name)
{
Console.WriteLine($"Hello, {name}!");
}
Keluaran:
Hello, Ploy!
Contoh 41: Argumen opsional dan bernama
Nilai default dan argumen bernama membuat pemanggilan jelas.
Console.WriteLine(Price(100));
Console.WriteLine(Price(100, tax: 0.2));
Console.WriteLine(Price(100, discount: 10));
static double Price(double amount, double tax = 0.07, double discount = 0)
{
return amount * (1 - discount / 100) * (1 + tax);
}
Keluaran:
107
120
96.30000000000001
Contoh 42: Parameter ref
ref meneruskan variabelnya sendiri, sehingga perubahan tetap ada setelah pemanggilan.
int total = 10;
AddTen(ref total);
Console.WriteLine(total);
static void AddTen(ref int value)
{
value += 10;
}
Keluaran:
20
Contoh 43: Parameter out
out mengembalikan nilai tambahan dari sebuah method.
if (TryDivide(10, 2, out int result))
{
Console.WriteLine($"Result {result}");
}
static bool TryDivide(int a, int b, out int quotient)
{
if (b == 0) { quotient = 0; return false; }
quotient = a / b;
return true;
}
Keluaran:
Result 5
Contoh 44: Array params
Menerima argumen berapa pun jumlahnya.
Console.WriteLine(Sum(1, 2, 3));
Console.WriteLine(Sum());
static int Sum(params int[] numbers)
{
int total = 0;
foreach (int n in numbers) total += n;
return total;
}
Keluaran:
6
0
Contoh 45: Overloading method
Nama method yang sama dengan tipe parameter yang berbeda.
Console.WriteLine(Printer.Show(7));
Console.WriteLine(Printer.Show("seven"));
Console.WriteLine(Printer.Show(7.5));
class Printer
{
public static string Show(int x) => $"int {x}";
public static string Show(string x) => $"string {x}";
public static string Show(double x) => $"double {x}";
}
Keluaran:
int 7
string seven
double 7.5
Contoh 46: Fungsi lokal
Fungsi yang dideklarasikan di dalam sebuah method.
Console.WriteLine(SumOfSquares(3));
static int SumOfSquares(int n)
{
int total = 0;
for (int i = 1; i <= n; i++) total += Square(i);
return total;
static int Square(int x) => x * x;
}
Keluaran:
14
Topik 6: Array dan list
Array memiliki panjang tetap. List bertambah ketika Anda menambahkan item. Keduanya menyimpan satu tipe nilai, dan keduanya diindeks mulai dari nol.
Array dan bentuknya
int[] a = { 1, 2, 3 } membuat array dengan panjang tetap. Array dua dimensi int[,] adalah grid. Array bergerigi int[][] adalah array dari array yang barisnya bisa memiliki panjang berbeda.
List<T> dan operasi umum
List<T> menambah, menyisipkan, menghapus, dan mencari item, dan bertambah besar secara otomatis. Count memberi jumlah item, Contains memeriksa keberadaan item, dan Sort mengurutkan list di tempatnya.
Menyalin dan mencari
Menugaskan satu array ke array lain menyalin referensinya, bukan datanya, jadi gunakan Clone atau Array.Copy untuk salinan yang independen. Find dan FindAll mencari dalam list dengan kondisi lambda, seperti w => w.Length > 4.
Contoh 47: Array
Koleksi berukuran tetap dari satu tipe.
int[] scores = { 90, 75, 88 };
Console.WriteLine(scores.Length);
Console.WriteLine(scores[0]);
scores[2] = 95;
Console.WriteLine(string.Join(", ", scores));
Keluaran:
3
90
90, 75, 95
Contoh 48: Nilai default pada array baru
Array baru diisi dengan nilai default.
int[] zeros = new int[4];
string[] names = new string[2];
Console.WriteLine(string.Join(",", zeros));
Console.WriteLine(names[0] is null);
Keluaran:
0,0,0,0
True
Contoh 49: Array dua dimensi
Grid nilai dengan dua indeks.
int[,] grid = new int[2, 3];
grid[1, 2] = 7;
Console.WriteLine(grid[1, 2]);
Console.WriteLine(grid.GetLength(1));
Keluaran:
7
3
Contoh 50: Array bergerigi
Array yang barisnya memiliki panjang berbeda.
int[][] rows = { new[] { 1 }, new[] { 2, 3 }, new[] { 4, 5, 6 } };
foreach (int[] row in rows)
{
Console.WriteLine(row.Length);
}
Keluaran:
1
2
3
Contoh 51: List: Add, Insert, dan Remove
List<T> bertambah ketika Anda menambahkan item.
var fruits = new List<string> { "apple" };
fruits.Add("banana");
fruits.Insert(0, "mango");
fruits.Remove("apple");
Console.WriteLine(string.Join(", ", fruits));
Keluaran:
mango, banana
Contoh 52: List: Count, Contains, dan IndexOf
Periksa ukuran list dan cari sebuah item.
var numbers = new List<int> { 4, 8, 15 };
Console.WriteLine(numbers.Count);
Console.WriteLine(numbers.Contains(8));
Console.WriteLine(numbers.IndexOf(15));
Keluaran:
3
True
2
Contoh 53: List: Sort dan Reverse
Urutkan item di tempatnya.
var values = new List<int> { 30, 10, 20 };
values.Sort();
Console.WriteLine(string.Join(" ", values));
values.Reverse();
Console.WriteLine(string.Join(" ", values));
Keluaran:
10 20 30
30 20 10
Contoh 54: Array.Sort dan Array.IndexOf
Urutkan array dan cari posisi sebuah item.
int[] data = { 5, 2, 9 };
Array.Sort(data);
Console.WriteLine(string.Join(" ", data));
Console.WriteLine(Array.IndexOf(data, 9));
Keluaran:
2 5 9
2
Contoh 55: Clone membuat salinan
Array hasil clone terpisah dari aslinya.
int[] original = { 1, 2, 3 };
int[] copy = (int[])original.Clone();
copy[0] = 99;
Console.WriteLine(original[0]);
Console.WriteLine(copy[0]);
Keluaran:
1
99
Contoh 56: Find dan FindAll
Cari dalam list dengan kondisi lambda.
var words = new List<string> { "tea", "coffee", "milk" };
string? first = words.Find(w => w.Length > 4);
Console.WriteLine(first);
Console.WriteLine(words.FindAll(w => w.Length == 3).Count);
Keluaran:
coffee
1
Topik 7: String
String adalah urutan karakter yang tidak bisa diubah. Method mengembalikan string baru, dan StringBuilder membantu ketika Anda membangun teks di dalam perulangan.
Penggabungan, Substring, dan pencarian
+ menggabungkan string. Substring memotong teks, IndexOf mencari posisi dan mengembalikan -1 jika teksnya tidak ada, dan Length menghitung karakter.
Membersihkan, memisahkan, dan menggabungkan
Trim menghapus spasi di kedua ujung, Replace menukar teks, dan ToUpper mengubah huruf besar-kecil. Split memecah teks pada pemisah, dan string.Join merangkai kembali sebuah array dengan pemisah di antara item.
Format dan string literal
Kode format seperti F2 menampilkan dua desimal dan N0 menambahkan pemisah. Awalan @ mempertahankan backslash pada path berkas, dan raw string literal yang ditulis di antara tiga tanda kutip ganda mempertahankan teks multibaris persis seperti yang ditulis.
Contoh 57: Penggabungan string
Gabungkan string dengan +.
string first = "Hello";
string second = "World";
Console.WriteLine(first + ", " + second + "!");
Keluaran:
Hello, World!
Contoh 58: Substring, IndexOf, dan Length
Potong dan cari di dalam teks.
string text = "C# programming";
Console.WriteLine(text.Length);
Console.WriteLine(text.Substring(0, 2));
Console.WriteLine(text.IndexOf("pro"));
Keluaran:
14
C#
3
Contoh 59: Trim, Replace, dan ToUpper
Bersihkan dan ubah teks.
string raw = " hello world ";
string cleaned = raw.Trim().Replace("world", "C#");
Console.WriteLine(cleaned.ToUpper());
Keluaran:
HELLO C#
Contoh 60: Split dan Join
Pecah teks menjadi bagian dan rangkai kembali.
string csv = "red,green,blue";
string[] parts = csv.Split(',');
Console.WriteLine(parts.Length);
Console.WriteLine(string.Join(" | ", parts));
Keluaran:
3
red | green | blue
Contoh 61: StringBuilder
Bangun teks panjang tanpa membuat banyak salinan.
var sb = new System.Text.StringBuilder();
for (int i = 1; i <= 3; i++)
{
sb.Append(i).Append(';');
}
Console.WriteLine(sb.ToString());
Keluaran:
1;2;3;
Contoh 62: Format angka
F2, N0, dan format kustom menampilkan angka dengan jelas.
System.Globalization.CultureInfo.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;
double amount = 1234.5;
Console.WriteLine(amount.ToString("F2"));
Console.WriteLine(amount.ToString("N0"));
Console.WriteLine($"{amount:0.000}");
Keluaran:
1234.50
1,234
1234.500
Contoh 63: String verbatim dan raw
@ mempertahankan backslash; raw literal menampung teks multibaris.
string path = @"C:\Users\student\notes.txt";
string json = """
{ "name": "Ada" }
""";
Console.WriteLine(path);
Console.WriteLine(json);
Keluaran:
C:\Users\student\notes.txt
{ "name": "Ada" }
Contoh 64: Palindrom dengan LINQ
Bandingkan sebuah string dengan kebalikannya.
string word = "level";
bool palindrome = word.SequenceEqual(word.Reverse());
Console.WriteLine($"{word} palindrome: {palindrome}");
Keluaran:
level palindrome: True
Topik 8: Class dan objek
Class adalah cetak biru. Objek adalah satu instance yang dibuat darinya, dengan datanya sendiri. Class adalah inti dari program C#.
Field, konstruktor, dan method
Class menyimpan data dalam field dan property, dan perilaku dalam method. Konstruktor berjalan ketika new membuat objek dan mengatur nilai awalnya. this merujuk ke objek saat ini.
Anggota statis dan instance
Anggota instance milik satu objek. Anggota statis milik class itu sendiri dan dipakai bersama oleh semua yang menggunakannya, seperti sebuah penghitung. ToString adalah override yang mengatur cara objek dicetak.
Object initializer
new User { Name = "Mali", Age = 22 } membuat objek dan mengatur property-nya dalam satu langkah. Initializer sering dipakai dalam pengujian dan kode konfigurasi karena setiap nilainya diberi nama.
Contoh 65: Class dan objek
Class adalah cetak biru; new membuat objek darinya.
var book = new Book();
book.Title = "Clean Code";
book.Pages = 464;
Console.WriteLine($"{book.Title} ({book.Pages} pages)");
class Book
{
public string Title = "";
public int Pages;
}
Keluaran:
Clean Code (464 pages)
Contoh 66: Konstruktor
Atur nilai ketika objek dibuat.
var p = new Point(3, 4);
Console.WriteLine($"Point at {p.X}, {p.Y}");
class Point
{
public int X { get; }
public int Y { get; }
public Point(int x, int y)
{
X = x;
Y = y;
}
}
Keluaran:
Point at 3, 4
Contoh 67: Method instance
Method bekerja pada data milik satu objek.
var account = new BankAccount(100);
account.Deposit(50);
Console.WriteLine(account.Balance);
class BankAccount
{
public decimal Balance { get; private set; }
public BankAccount(decimal opening) => Balance = opening;
public void Deposit(decimal amount) => Balance += amount;
}
Keluaran:
150
Contoh 68: Anggota statis
Dipakai oleh seluruh class, bukan oleh satu objek.
Counter.Increment();
Counter.Increment();
Console.WriteLine(Counter.Count);
static class Counter
{
public static int Count { get; private set; }
public static void Increment() => Count++;
}
Keluaran:
2
Contoh 69: this dan ToString
this merujuk ke objek saat ini; ToString menampilkannya sebagai teks.
var car = new Car("Civic", 2020);
Console.WriteLine(car);
class Car
{
private readonly string model;
private readonly int year;
public Car(string model, int year)
{
this.model = model;
this.year = year;
}
public override string ToString() => $"{model} ({year})";
}
Keluaran:
Civic (2020)
Contoh 70: Object initializer
Atur property di dalam kurung kurawal ketika membuat objek.
var user = new User { Name = "Mali", Age = 22 };
Console.WriteLine($"{user.Name} is {user.Age}");
class User
{
public string Name { get; set; } = "";
public int Age { get; set; }
}
Keluaran:
Mali is 22
Topik 9: Property dari setiap jenis
Property terlihat seperti field dari luar, tetapi menjalankan kode ketika dibaca atau ditulis. C# memiliki beberapa jenis property, dan setiap jenis cocok untuk tugas yang berbeda.
Auto-property dan full property
Auto-property seperti public int Score { get; set; } mendapatkan field penyimpanan tersembunyi secara otomatis. Full property memiliki blok get dan set, yang memungkinkan Anda memeriksa atau mengubah nilai sebelum disimpan.
Property hanya-baca, terhitung, dan init-only
Property yang hanya memiliki get bersifat hanya-baca. Property terhitung seperti Area => Width * Height menghitung nilainya setiap kali dibaca. Property init-only bisa diatur di dalam object initializer dan setelah itu menjadi hanya-baca, cocok untuk objek konfigurasi.
Anggota wajib, nullable, dan property indexer
required memaksa pemanggil mengatur anggota. string? menyatakan bahwa referensi bisa null, dan kompiler memberi peringatan ketika Anda memakainya dengan tidak aman. Indexer memungkinkan objek dipakai dengan kurung siku, seperti array.
Virtual, abstract, dan property interface
Property virtual bisa diganti di subclass dengan override. Property abstract harus disediakan oleh setiap subclass. Property interface adalah janji bahwa setiap class yang mengimplementasikan interface itu akan memiliki property tersebut.
Contoh 71: Auto-property
Property yang get dan set-nya dibuat untuk Anda.
var player = new Player();
player.Name = "Nok";
player.Score = 50;
Console.WriteLine($"{player.Name}: {player.Score}");
class Player
{
public string Name { get; set; } = "";
public int Score { get; set; }
}
Keluaran:
Nok: 50
Contoh 72: Full property dengan validasi
Periksa nilai sebelum disimpan.
var t = new Thermometer();
t.Celsius = 25;
Console.WriteLine(t.Celsius);
t.Celsius = -300;
Console.WriteLine(t.Celsius);
class Thermometer
{
private double celsius;
public double Celsius
{
get => celsius;
set => celsius = value < -273.15 ? -273.15 : value;
}
}
Keluaran:
25
-273.15
Contoh 73: Property terhitung hanya-get
Nilai yang dihitung dari nilai lain setiap kali dibaca.
var rect = new Rectangle(4, 5);
Console.WriteLine($"Area {rect.Area}");
class Rectangle
{
public Rectangle(double w, double h)
{
Width = w;
Height = h;
}
public double Width { get; }
public double Height { get; }
public double Area => Width * Height;
}
Keluaran:
Area 20
Contoh 74: Property init-only
Diatur di dalam initializer, lalu hanya-baca.
var config = new ServerConfig { Host = "localhost", Port = 8080 };
Console.WriteLine($"{config.Host}:{config.Port}");
class ServerConfig
{
public string Host { get; init; } = "";
public int Port { get; init; }
}
Keluaran:
localhost:8080
Contoh 75: Anggota wajib
Kompiler memaksa pemanggil mengatur anggota tersebut.
var emp = new Employee { Id = 7, Name = "Som" };
Console.WriteLine($"{emp.Id} {emp.Name}");
class Employee
{
public required int Id { get; init; }
public required string Name { get; init; }
}
Keluaran:
7 Som
Contoh 76: Property nullable
string? mengizinkan null; kompiler memberi peringatan tentang pemakaian yang berisiko.
var profile = new Profile();
Console.WriteLine(profile.Nickname ?? "(none)");
profile.Nickname = "Bee";
Console.WriteLine(profile.Nickname.Length);
class Profile
{
public string? Nickname { get; set; }
}
Keluaran:
(none)
3
Contoh 77: Property indexer
Gunakan objek dengan kurung siku, seperti array.
var shelf = new Shelf();
shelf[0] = "Novel";
shelf[1] = "Atlas";
Console.WriteLine(shelf[1]);
class Shelf
{
private readonly string[] books = new string[5];
public string this[int index]
{
get => books[index];
set => books[index] = value;
}
}
Keluaran:
Atlas
Contoh 78: Property virtual dan override
Subclass mengganti perilaku sebuah property.
Animal[] pets = { new Dog(), new Animal() };
foreach (Animal pet in pets)
{
Console.WriteLine($"{pet.Kind}: {pet.Sound}");
}
class Animal
{
public virtual string Kind => "Animal";
public virtual string Sound => "...";
}
class Dog : Animal
{
public override string Kind => "Dog";
public override string Sound => "Woof";
}
Keluaran:
Dog: Woof
Animal: ...
Contoh 79: Property abstract
Class dasar mewajibkan setiap subclass menyediakan property tersebut.
Shape circle = new Circle(2);
Console.WriteLine($"{circle.Name} area {circle.Area:F2}");
abstract class Shape
{
public abstract string Name { get; }
public abstract double Area { get; }
}
class Circle : Shape
{
private readonly double radius;
public Circle(double r) => radius = r;
public override string Name => "Circle";
public override double Area => Math.PI * radius * radius;
}
Keluaran:
Circle area 12.57
Contoh 80: Property interface
Interface menjanjikan sebuah property kepada setiap class yang mengimplementasikannya.
ISensor sensor = new TempSensor();
Console.WriteLine($"{sensor.Unit}: {sensor.Reading}");
interface ISensor
{
string Unit { get; }
double Reading { get; }
}
sealed class TempSensor : ISensor
{
public string Unit => "Celsius";
public double Reading => 21.5;
}
Keluaran:
Celsius: 21.5
Topik 10: Pewarisan, interface, dan polimorfisme
Pewarisan memungkinkan satu class dibangun di atas class lain. Interface mendeskripsikan apa yang bisa dilakukan sebuah class. Polimorfisme memungkinkan satu bagian kode bekerja dengan banyak tipe.
Class dasar dan konstruktor
Subclass memakai titik dua untuk menyebut class dasarnya dan bisa meneruskan nilai ke konstruktor induk dengan base(...). Pewarisan menggunakan kembali kode, tetapi rantai yang dalam sulit diubah, jadi jaga hierarki tetap dangkal.
Class abstrak dan interface
Class abstrak bisa menyimpan kode bersama dan membiarkan beberapa langkah tetap abstrak. Interface mendaftar anggota yang harus disediakan sebuah class. Sebuah class bisa mengimplementasikan banyak interface tetapi hanya mewarisi satu class dasar.
Polimorfisme dan pemeriksaan tipe
Daftar objek Figure bisa berisi persegi dan segitiga, dan memanggil Area() menjalankan versi yang tepat untuk setiap objek. is dan as menguji atau mengonversi tipe dengan aman, dan sealed mencegah sebuah class diwarisi.
Contoh 81: Konstruktor dasar dan pewarisan
Subclass meneruskan nilai ke induknya dengan base.
var child = new Student("Ana", 2);
Console.WriteLine($"{child.Name} year {child.Year}");
class Person
{
public string Name { get; }
public Person(string name) => Name = name;
}
class Student : Person
{
public int Year { get; }
public Student(string name, int year) : base(name) => Year = year;
}
Keluaran:
Ana year 2
Contoh 82: Template class abstrak
Induk mengatur langkah-langkahnya; setiap anak mengisi salah satunya.
Report report = new SalesReport();
report.Print();
abstract class Report
{
public void Print()
{
Console.WriteLine("== Report ==");
Console.WriteLine(Body());
}
protected abstract string Body();
}
class SalesReport : Report
{
protected override string Body() => "Sales up 12%";
}
Keluaran:
== Report ==
Sales up 12%
Contoh 83: Implementasi interface
Class yang berbeda berbagi satu interface.
IGreeter[] greeters = { new English(), new Spanish() };
foreach (IGreeter g in greeters) Console.WriteLine(g.Greet());
interface IGreeter { string Greet(); }
class English : IGreeter { public string Greet() => "Hello"; }
class Spanish : IGreeter { public string Greet() => "Hola"; }
Keluaran:
Hello
Hola
Contoh 84: Polimorfisme dalam list
Satu list menampung banyak tipe, dan setiap objek mengerjakan tugasnya sendiri.
List<Figure> figures = new() { new Square(3), new Triangle(4, 5) };
foreach (Figure f in figures)
{
Console.WriteLine($"{f.GetType().Name}: {f.Area()}");
}
abstract class Figure
{
public abstract double Area();
}
class Square : Figure
{
private readonly double side;
public Square(double s) => side = s;
public override double Area() => side * side;
}
class Triangle : Figure
{
private readonly double b, h;
public Triangle(double b, double h) { this.b = b; this.h = h; }
public override double Area() => 0.5 * b * h;
}
Keluaran:
Square: 9
Triangle: 10
Contoh 85: as dan is
Pemeriksaan tipe dan konversi yang aman.
object item = "text";
string? s = item as string;
Console.WriteLine(s?.Length);
Console.WriteLine(item is int);
Keluaran:
4
False
Topik 11: Record, struct, dan enum
Tipe-tipe ini mendeskripsikan data. Record adalah class dengan kesamaan nilai yang sudah tersedia, struct adalah tipe nilai kecil, dan enum adalah sekumpulan konstanta bernama.
Record
Record seperti record PersonRecord(string Name, int Age) mendapatkan constructor, property, kesamaan, dan ToString yang mudah dibaca secara otomatis. Dua record dengan nilai yang sama itu sama. with menyalin record dan hanya mengubah field yang Anda sebutkan.
Struct
Struct adalah tipe nilai. Ia disalin ketika ditugaskan dan disimpan secara sebaris, cocok untuk nilai kecil seperti titik atau pasangan uang. Jaga struct tetap kecil dan tidak bisa diubah, karena salinan bisa membuat Anda terkejut.
Enum dan flags
Enum memberi nama pada angka, jadi Status.Shipped lebih mudah dibaca daripada 5. Enum yang diberi [Flags] bisa menggabungkan pilihan dengan OR bitwise, seperti Access.Read | Access.Write, dan HasFlag memeriksa salah satunya.
Contoh 86: Record
Tipe untuk data dengan kesamaan nilai bawaan.
var a = new PersonRecord("Pim", 30);
var b = new PersonRecord("Pim", 30);
Console.WriteLine(a == b);
Console.WriteLine(a);
record PersonRecord(string Name, int Age);
Keluaran:
True
PersonRecord { Name = Pim, Age = 30 }
Contoh 87: Record dengan ekspresi with
Salin record dan ubah satu field.
var original = new Settings("dark", 12);
var changed = original with { FontSize = 14 };
Console.WriteLine($"{original.FontSize} {changed.FontSize} {changed.Theme}");
record Settings(string Theme, int FontSize);
Keluaran:
12 14 dark
Contoh 88: Struct dengan operator
Tipe nilai kecil yang meng-overload +.
var v1 = new Vec(1, 2);
var v2 = v1 + new Vec(3, 4);
Console.WriteLine(v2);
struct Vec
{
public int X { get; }
public int Y { get; }
public Vec(int x, int y) { X = x; Y = y; }
public static Vec operator +(Vec a, Vec b) => new Vec(a.X + b.X, a.Y + b.Y);
public override string ToString() => $"({X}, {Y})";
}
Keluaran:
(4, 6)
Contoh 89: Enum
Sekumpulan konstanta bernama.
Status s = Status.Shipped;
Console.WriteLine(s);
Console.WriteLine((int)s);
Console.WriteLine(Enum.Parse<Status>("Pending"));
enum Status { Pending, Paid, Shipped = 5 }
Keluaran:
Shipped
5
Pending
Contoh 90: Enum flags
Gabungkan pilihan dengan bit flag.
Access rights = Access.Read | Access.Write;
Console.WriteLine(rights);
Console.WriteLine(rights.HasFlag(Access.Write));
[Flags]
enum Access { None = 0, Read = 1, Write = 2, Execute = 4 }
Keluaran:
Read, Write
True
Topik 12: Koleksi, LINQ, dan generics
Koleksi menyimpan kelompok nilai. LINQ melakukan kueri terhadapnya dengan cara yang mudah dibaca, dan generics memungkinkan satu class bekerja dengan banyak tipe.
Dictionary, HashSet, Queue, dan Stack
Dictionary menyimpan pasangan kunci dan nilai, serta mencari nilai berdasarkan kunci. HashSet menyimpan item yang unik. Queue adalah first in, first out, dan Stack adalah last in, first out. Pilih yang sesuai dengan cara Anda perlu mengambil item.
Kueri LINQ
Where memfilter, Select mengubah, OrderBy mengurutkan, dan GroupBy mengelompokkan. Setiap langkah mengembalikan urutan baru, dan tidak ada yang berjalan sampai Anda membaca hasilnya, yang disebut deferred execution.
Class generik
Class seperti Box<T> bekerja dengan tipe T apa pun yang Anda sebutkan di dalam tanda kurung sudut. Kompiler memeriksa tipenya, sehingga Box<int> tidak bisa menampung string, dan tidak diperlukan casting.
Contoh 91: Dictionary
Simpan nilai dan cari berdasarkan kunci.
var prices = new Dictionary<string, decimal>
{
["tea"] = 25m,
["cake"] = 60m
};
prices["juice"] = 35m;
Console.WriteLine(prices["cake"]);
Console.WriteLine(prices.ContainsKey("water"));
foreach (var (item, price) in prices)
{
Console.WriteLine($"{item}: {price}");
}
Keluaran:
60
False
tea: 25
cake: 60
juice: 35
Contoh 92: HashSet
Koleksi yang tidak menyimpan duplikat.
var tags = new HashSet<string> { "csharp", "dotnet", "csharp" };
Console.WriteLine(tags.Count);
Console.WriteLine(tags.Contains("dotnet"));
Keluaran:
2
True
Contoh 93: Queue dan Stack
First in, first out; dan last in, first out.
var queue = new Queue<string>();
queue.Enqueue("first");
queue.Enqueue("second");
Console.WriteLine(queue.Dequeue());
var stack = new Stack<string>();
stack.Push("a");
stack.Push("b");
Console.WriteLine(stack.Pop());
Keluaran:
first
b
Contoh 94: LINQ: Where dan Select
Filter dan ubah koleksi dengan sebuah kueri.
int[] numbers = { 1, 2, 3, 4, 5, 6 };
var evenSquares = numbers.Where(n => n % 2 == 0).Select(n => n * n);
Console.WriteLine(string.Join(", ", evenSquares));
Keluaran:
4, 16, 36
Contoh 95: LINQ: GroupBy dan OrderBy
Kelompokkan item berdasarkan kunci dan urutkan kelompoknya.
var words = new[] { "apple", "avocado", "banana", "blueberry", "cherry" };
var groups = words.GroupBy(w => w[0]).OrderBy(g => g.Key);
foreach (var g in groups)
{
Console.WriteLine($"{g.Key}: {string.Join(", ", g.OrderBy(w => w.Length))}");
}
Keluaran:
a: apple, avocado
b: banana, blueberry
c: cherry
Contoh 96: Class generik
Class yang bekerja dengan tipe apa pun yang diberikan dalam tanda kurung sudut.
var intBox = new Box<int>(42);
var textBox = new Box<string>("hi");
Console.WriteLine(intBox.Value + 1);
Console.WriteLine(textBox.Value.ToUpper());
class Box<T>
{
public T Value { get; }
public Box(T value) => Value = value;
}
Keluaran:
43
HI
Topik 13: Delegate, kode async, dan exception
Delegate menyimpan method di dalam variabel. async dan await menjaga program tetap responsif ketika menunggu. Exception melaporkan error dan memungkinkan Anda pulih darinya.
Func, Action, dan lambda
Func<int, int, int> adalah tipe delegate untuk method yang menerima dua int dan mengembalikan int. Action dipakai untuk method yang tidak mengembalikan apa pun. Lambda seperti (a, b) => a * b adalah cara singkat untuk menulisnya.
async dan await
Method async mengembalikan Task, dan await menjeda method itu tanpa memblokir thread. Task.Delay menunggu tanpa memakai waktu CPU, dan program melanjutkan ketika penundaan selesai.
try, catch, finally, dan exception kustom
try menampung kode yang mungkin gagal, catch menangani tipe exception tertentu, dan finally selalu dijalankan, sehingga cocok untuk pembersihan. Exception kustom mewarisi dari Exception dan membawa pesan yang jelas untuk pemanggil.
Contoh 97: Func dan Action
Simpan method di dalam variabel.
Func<int, int, int> multiply = (a, b) => a * b;
Action<string> announce = msg => Console.WriteLine($"[{msg}]");
announce($"result {multiply(6, 7)}");
Keluaran:
[result 42]
Contoh 98: async dan await
Jalankan pekerjaan tanpa memblokir program.
Console.WriteLine("Start");
int answer = await ComputeAsync();
Console.WriteLine($"Answer {answer}");
static async Task<int> ComputeAsync()
{
await Task.Delay(10);
return 42;
}
Keluaran:
Start
Answer 42
Contoh 99: try, catch, dan finally
Tangani error dan selalu jalankan pembersihan.
try
{
int[] data = new int[2];
Console.WriteLine(data[5]);
}
catch (IndexOutOfRangeException ex)
{
Console.WriteLine($"Caught: {ex.GetType().Name}");
}
finally
{
Console.WriteLine("Cleanup done");
}
Keluaran:
Caught: IndexOutOfRangeException
Cleanup done
Contoh 100: Exception kustom
Buat tipe error Anda sendiri dengan pesan yang jelas.
try
{
Withdraw(20, 50);
}
catch (InsufficientFundsException ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
static void Withdraw(decimal balance, decimal amount)
{
if (amount > balance)
throw new InsufficientFundsException(balance, amount);
Console.WriteLine("Withdrawn");
}
class InsufficientFundsException : Exception
{
public InsufficientFundsException(decimal balance, decimal amount)
: base($"Balance {balance} is less than {amount}") { }
}
Keluaran:
Error: Balance 20 is less than 50
Proyek latihan: Laporan nilai
Gabungkan gagasan menjadi satu program. Tulis sendiri terlebih dahulu, lalu bandingkan dengan contohnya. Setiap langkah memakai pekerjaan dari satu atau dua contoh.
1. Buat record Student dengan nama dan nilai, lalu buat list berisi lima siswa.
2. Gunakan LINQ untuk menyimpan siswa dengan nilai 50 atau lebih, diurutkan dari yang tertinggi ke yang terendah.
3. Cetak setiap siswa yang lulus dengan string interpolasi, dengan nama diberi padding ke lebar tetap dan nilai ditampilkan dengan F0.
4. Simpan setiap nilai huruf dalam Dictionary<string, string>, memakai ekspresi switch: A untuk 80 atau lebih, B untuk 70 atau lebih, C untuk 50 atau lebih, dan F selainnya.
5. Tambahkan exception kustom yang dilempar ketika nilai di bawah 0 atau di atas 100, dan tangkap di blok try yang mencetak pesannya.
Langkah berikutnya
Berikutnya, bangun aplikasi sungguhan dengan template dotnet new console dan dotnet new webapi, tambahkan pengujian unit dengan xUnit, baca berkas konfigurasi, dan pelajari Entity Framework Core untuk database. Keluaran yang ditampilkan untuk setiap contoh diambil dari proses yang benar-benar dijalankan di .NET 8, jadi jika keluaran Anda berbeda, periksa versi SDK Anda terlebih dahulu.
Ringkasan
Program C# dibangun dari pernyataan, method, tipe, dan objek. Melalui 100 contoh yang sudah dikompilasi, artikel ini membahas variabel, operator, keputusan dan pattern, perulangan, method, array, list, string, class, setiap jenis property, pewarisan dan interface, record, struct dan enum, koleksi dengan LINQ, generics, delegate, kode async, dan exception. Setiap contoh menampilkan kode lengkap dan keluaran sebenarnya. Cara terbaik untuk berlatih adalah mengubah sebuah nilai, memprediksi hasilnya, lalu menjalankan program untuk memeriksanya.