C# dan .NET dari Nol hingga 100 Contoh: Tipe, Property, Class, LINQ, Async, dan Exception

C# dan .NET dari Nol hingga 100 Contoh: Tipe, Properti, Kelas, 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

Cara program C# berjalan di .NET: kompiler C# mengubah kode sumber menjadi IL dalam berkas .dll, dan JIT compiler runtime mengubah IL itu menjadi kode mesin saat program berjalan
Cara program C# berjalan di .NET: kompiler C# mengubah kode sumber menjadi IL dalam berkas .dll, dan JIT compiler runtime mengubah IL itu menjadi kode mesin saat program berjalan

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.