Method (atau fungsi) adalah blok kode yang diberi nama dan bisa dipanggil berkali-kali. Bayangkan membangun sistem pembayaran seperti yang digunakan di platform e-commerce — kamu akan membuat method HitungTotal(), TerapkanDiskon(), ProsesPembayaran() yang bisa dipanggil ulang tanpa menulis kode yang sama berulang kali. Di artikel ini kita akan mempelajari cara membuat method yang efektif di C#.
Anatomi Method di C#
// Syntax dasar
[akses_modifier] [static] tipe_return NamaMethod(tipe param, ...)
{
// isi method
return nilai;
}
Method paling sederhana:
// Program.cs (top-level statements C# modern)
static int Tambah(int a, int b)
{
return a + b;
}
// Memanggil method
int hasil = Tambah(5, 3);
Console.WriteLine($"5 + 3 = {hasil}");
// Output: 5 + 3 = 8
Console.WriteLine($"100 + 250 = {Tambah(100, 250)}");
// Output: 100 + 250 = 350
Method void (Tanpa Nilai Kembalian)
static void TampilkanJudul(string judul)
{
int panjang = judul.Length + 4;
Console.WriteLine(new string('=', panjang));
Console.WriteLine($"| {judul} |");
Console.WriteLine(new string('=', panjang));
}
static void SapaUser(string nama)
{
Console.WriteLine($"Selamat datang, {nama}!");
Console.WriteLine($"Hari ini: {DateTime.Now:dddd, d MMMM yyyy}");
}
TampilkanJudul("Dashboard");
SapaUser("Rina");
// Output:
// ===========
// | Dashboard |
// ===========
// Selamat datang, Rina!
// Hari ini: Minggu, 5 April 2026
Parameter Optional (Default Values)
Parameter dengan nilai default tidak wajib diisi saat pemanggilan:
static string FormatHarga(
decimal jumlah,
string mata_uang = "Rp",
bool tampilkan_desimal = false)
{
string format = tampilkan_desimal ? "N2" : "N0";
return $"{mata_uang} {jumlah.ToString(format)}";
}
Console.WriteLine(FormatHarga(150000));
// Output: Rp 150.000
Console.WriteLine(FormatHarga(99.99m, "$", true));
// Output: $ 99,99
Console.WriteLine(FormatHarga(1500000, tampilkan_desimal: true));
// Output: Rp 1.500.000,00 (named argument — urutan bebas)
Named Arguments memungkinkan kamu menyebut nama parameter saat pemanggilan, sehingga urutan bisa bebas dan kode lebih mudah dibaca.
Method Overloading
Beberapa method bisa memiliki nama yang sama selama parameter berbeda:
static double Luas(double sisi)
{
return sisi * sisi; // Luas persegi
}
static double Luas(double panjang, double lebar)
{
return panjang * lebar; // Luas persegi panjang
}
static double Luas(double alas, double tinggi, bool segitiga)
{
return 0.5 * alas * tinggi; // Luas segitiga
}
Console.WriteLine($"Persegi 5cm: {Luas(5)} cm²");
// Output: Persegi 5cm: 25 cm²
Console.WriteLine($"Persegi panjang 4x6cm: {Luas(4, 6)} cm²");
// Output: Persegi panjang 4x6cm: 24 cm²
Console.WriteLine($"Segitiga alas 8 tinggi 5: {Luas(8, 5, true)} cm²");
// Output: Segitiga alas 8 tinggi 5: 20 cm²
Expression-Bodied Members (C# 6+)
Method satu baris bisa ditulis lebih ringkas dengan =>:
// Method biasa
static int Kuadrat(int n)
{
return n * n;
}
// Expression-bodied — lebih ringkas
static int KuadratEx(int n) => n * n;
static double KelilingSegi(double sisi) => 4 * sisi;
static bool AdulIf(int umur) => umur >= 18;
static string Sapa(string nama) => $"Halo, {nama}!";
Console.WriteLine(KuadratEx(7)); // Output: 49
Console.WriteLine(KelilingSegi(5.5)); // Output: 22
Console.WriteLine(AdulIf(20)); // Output: True
Console.WriteLine(Sapa("Didi")); // Output: Halo, Didi!
ref dan out — Mengembalikan Banyak Nilai
out — Mengembalikan Nilai Tambahan
static bool BagiDenganSisa(int a, int b, out int sisa)
{
if (b == 0)
{
sisa = 0;
return false;
}
sisa = a % b;
return true;
}
if (BagiDenganSisa(17, 5, out int sisa))
{
Console.WriteLine($"17 / 5 = {17 / 5} sisa {sisa}");
// Output: 17 / 5 = 3 sisa 2
}
// Contoh nyata: int.TryParse menggunakan out
string input = "42";
if (int.TryParse(input, out int angka))
{
Console.WriteLine($"Berhasil: {angka}");
// Output: Berhasil: 42
}
ref — Mengubah Variabel Asli
static void Tukar(ref int a, ref int b)
{
int temp = a;
a = b;
b = temp;
}
int x = 10, y = 20;
Console.WriteLine($"Sebelum: x={x}, y={y}");
// Output: Sebelum: x=10, y=20
Tukar(ref x, ref y);
Console.WriteLine($"Sesudah: x={x}, y={y}");
// Output: Sesudah: x=20, y=10
Contoh Nyata: Kalkulator BMI
static double HitungBMI(double berat_kg, double tinggi_cm)
{
double tinggi_m = tinggi_cm / 100.0;
return berat_kg / (tinggi_m * tinggi_m);
}
static string KategoriBMI(double bmi) => bmi switch
{
< 18.5 => "Berat badan kurang",
< 25.0 => "Berat badan normal",
< 30.0 => "Kelebihan berat badan",
_ => "Obesitas"
};
static void TampilkanHasilBMI(string nama, double berat, double tinggi)
{
double bmi = HitungBMI(berat, tinggi);
string kategori = KategoriBMI(bmi);
Console.WriteLine($"[{nama}] BMI: {bmi:F1} → {kategori}");
}
TampilkanHasilBMI("Budi", 70, 175);
// Output: [Budi] BMI: 22.9 → Berat badan normal
TampilkanHasilBMI("Ani", 48, 160);
// Output: [Ani] BMI: 18.8 → Berat badan normal
TampilkanHasilBMI("Candra", 90, 170);
// Output: [Candra] BMI: 31.1 → Obesitas
Pertanyaan yang Sering Diajukan
Apa perbedaan static dan non-static method?
static method bisa dipanggil langsung melalui nama class tanpa membuat objek. Non-static method membutuhkan objek (instance) terlebih dahulu. Dalam top-level statements C# modern, semua method yang kamu buat harus static karena kamu berada di luar class. Konsep non-static akan lebih relevan saat belajar OOP.
Kapan menggunakan out vs mengembalikan tuple?
Gunakan out untuk pola “coba lakukan dan kembalikan status” seperti TryParse. Gunakan tuple ((int a, int b) Metode()) saat ingin mengembalikan beberapa nilai terkait tanpa membuat parameter tambahan. Tuple lebih modern dan lebih mudah dibaca untuk kasus umum.
Apa itu expression-bodied member dan kapan menggunakannya?
Expression-bodied member (=> ekspresi) adalah sintaks ringkas untuk method yang hanya berisi satu ekspresi return. Cocok digunakan untuk method sederhana seperti getter, method konversi, atau method matematika. Hindari untuk logika kompleks yang akan menjadi sulit dibaca jika diringkas.
Apakah overloading sama dengan override?
Tidak! Overloading adalah membuat method dengan nama sama tapi parameter berbeda dalam class yang sama. Override adalah mengganti implementasi method dari class induk di class turunan (bagian dari OOP/inheritance). Keduanya menggunakan konsep “nama sama tapi perilaku berbeda”, tapi dalam konteks yang sangat berbeda.
Kesimpulan
Ringkasan konsep method di C#:
| Konsep | Sintaks | Keterangan |
|---|---|---|
| Method dasar | static Tipe Nama(params) { } | Blok kode dengan nama |
| void method | static void Nama() { } | Tidak mengembalikan nilai |
| Optional params | void F(int x = 0) | Nilai default jika tidak diisi |
| Named arguments | F(nama: "Ali") | Urutan argumen bebas |
| Overloading | Nama sama, params beda | Polimorfisme di level method |
| Expression-bodied | static int F(int n) => n * n; | Singkat untuk satu ekspresi |
| out parameter | void F(out int hasil) | Mengembalikan nilai tambahan |
| ref parameter | void F(ref int x) | Mengubah variabel asli |
Artikel sebelumnya: Percabangan dan Perulangan di C# — cara membuat keputusan dan loop di C#.
Kamu sudah menyelesaikan fondasi C#! Langkah selanjutnya adalah mempelajari Object-Oriented Programming (OOP) di C# — bagaimana membangun aplikasi yang lebih besar dengan class dan object.