Langsung ke konten
KamusNgoding
Pemula Csharp 3 menit baca

Fungsi dan Method di C#: Parameter, Return, dan Overloading

#csharp #method #fungsi #parameter #return #overloading #expression-body #optional-parameter

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#:

KonsepSintaksKeterangan
Method dasarstatic Tipe Nama(params) { }Blok kode dengan nama
void methodstatic void Nama() { }Tidak mengembalikan nilai
Optional paramsvoid F(int x = 0)Nilai default jika tidak diisi
Named argumentsF(nama: "Ali")Urutan argumen bebas
OverloadingNama sama, params bedaPolimorfisme di level method
Expression-bodiedstatic int F(int n) => n * n;Singkat untuk satu ekspresi
out parametervoid F(out int hasil)Mengembalikan nilai tambahan
ref parametervoid 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.

Artikel Terkait