Halo! Selamat datang kembali di “Seri Belajar Dasar Pemrograman Bahasa C#“. Setelah sebelumnya mempelajari bagaimana mendefinisikan dan memanggil sebuah method di C#, kali ini kita akan mempelajari beberapa pengubah parameter pada method di C# (parameters modifier) seperti ref
, out
, dan params
.
Method Tanpa Pengubah Parameter
Katakanlah kita memiliki dua variabel string str1
dan str2
yang masing-masing bernilai “Flip” dan “Flop” secara berurutan, seperti pada kode program di bawah ini.
string str1 = "Flip", str2 = "Flop";
Lalu, kita diminta untuk membuat sebuah method untuk menukar nilai str1
dengan str2
dan juga sebaliknya. Dengan pengetahuan kita sampai saat ini, tanpa berpikir panjang, kita akan membuat sebuah method seperti di bawah ini.
static void TukarString(string s1, string s2)
{
string tempStr = s1;
s1 = s2;
s2 = tempStr;
}
Pertama-tama kita perlu membuat sebuah variabel lokal untuk menampung sementara nilai dari parameter string s1
, yaitu tempStr
. Baru setelah itu, kita bisa mengganti nilai s1
dengan nilai parameter s2
. Terakhir, kita mengganti nilai s2
dengan nilai variabel tempStr
yang sebelumnya telah kita tetapkan dengan nilai dari s1
.
Bagus! Sekarang kita sudah mempunyai sebuah method untuk menukar nilai dari dua variabel string. Saatnya memanggil method tersebut dari Main()
.
using System;
namespace PengubahParameter
{
class Program
{
static void Main(string[] args)
{
string str1 = "Flip", str2 = "Flop";
Console.WriteLine($"Sebelum memanggil method TukarString(): str1 = {str1}, str2 = {str2}");
TukarString(str1, str2);
Console.WriteLine($"Setelah memanggil method TukarString(): str1 = {str1}, str2 = {str2}");
}
}
}
Sayangnya, kode program di atas tidak menghasilkan keluaran yang sesuai dengan ekspektasi.
Sebelum memanggil method TukarString(): str1 = Flip, str2 = Flop
Setelah memanggil method TukarString(): str1 = Flip, str2 = Flop
Sepertinya method TukarString()
tidak berfungsi sebagaimana mestinya. Nilai variabel str1
dan str2
sama sekali tidak berubah meskipun telah kita berikan kepada method TukarString()
sebagai argumen.
Masalah ini bisa kita atasi dengan melakukan sedikit modifikasi pada parameter method TukarString()
seperti yang akan kita pelajari selanjutnya.
Pengubah Parameter ref
Jadi, mengapa method TukarString()
sebelumnya tidak berfungsi dengan semestinya?
Tanpa pengubah parameter (parameters modifier) apapun, parameter pada sebuah method hanya akan menerima nilai literal dari sebuah variabel sebagai argumen. Maksudnya, jika kita memberikan variabel str1
dan str2
sebagai argumen untuk method TukarString()
, maka hanya nilai literal dari kedua variabel tersebut, yaitu “Flip” dan “Flop”, yang akan disalin ke parameter s1
dan s2
pada method TukarString()
.
Dengan demikian, parameter s1
dan s2
hanya merupakan salinan dari nilai literal variabel str1
dan str2
. Parameter s1
dan s2
sama sekali tidak mengetahui informasi apapun tentang variabel str1
dan str2
kecuali hanya nilai literalnya saja.
Oleh karena itulah, nilai variabel str1
dan str2
sama sekali tidak tertukar meskipun kita telah memberikannya ke method TukarString()
sebagai argumen.
Untuk mendapatkan hasil yang sesuai dengan ekspektasi, kita perlu membuat parameter s1
dan s2
menyalin alamat/lokasi di mana variabel str1
dan str2
disimpan di dalam memori. Dengan demikian, parameter s1
dan s2
nantinya bisa menjadi referensi bagi method TukarString()
untuk mengubah nilai variabel str1
dan str2
.
Agar parameter s1
dan s2
bisa mendapatkan informasi mengenai alamat memori dari variabel str1
dan str2
, kita bisa bisa melakukan sedikit modifikasi pada kedua parameter tersebut dengan menambahkan kata kunci ref
.
Ubah method TukarString()
sebelumnya menjadi seperti kode program di bawah ini. Perhatikan kata kunci ref
pada masing-masing parameter s1
dan s2
.
static void TukarString(ref string s1, ref string s2)
{
string tempStr = s1;
s1 = s2;
s2 = tempStr;
}
Ubah juga kode program untuk memanggil method TukarString()
di dalam method Main()
dari:
TukarString(str1, str2);
menjadi seperti ini:
TukarString(ref str1, ref str2);
Kali ini kita akan mendapatkan keluaran yang sesuai dengan ekspektasi apabila kode program tersebut kita jalankan.
Sebelum memanggil method TukarString(): str1 = Flip, str2 = Flop
Setelah memanggil method TukarString(): str1 = Flop, str2 = Flip
Dengan menggunakan pengubah parameter ref
, berarti kita memberitahu compiler bahwa parameter s1
dan s2
kali ini kita minta untuk menyalin alamat/lokasi memori variabel str1
dan str2
, bukan menyalin nilai literalnya.
Karena kini method TukarString()
memiliki referensi ke lokasi variabel str1
dan str2
melalui parameter s1
dan s2
, memodifikasi kedua parameter tersebut juga akan mengubah nilai literal dari variabel str1
dan str2
.
Catatan
Untuk memperdalam pengetahuan Anda tentang kedua materi di atas. Anda bisa mempelajari materi tentang “Memahami Pass By Value Dan Pass By Reference Di C#”.
Hal Yang Perlu Diperhatikan Dari Penggunaan Pengubah Parameter ref
Beberapa hal yang perlu diperhatikan pada saat menggunakan pengubah parameter ref
adalah, argumen yang diberikan harus berupa sebuah variabel. Kode program di bawah ini akan menghasilkan error karena kita menggunakan konstanta (dalam hal ini sebuah teks) sebagai argumen.
TukarString(ref "Flip", ref "Flop");
Selain itu, variabel yang akan kita berikan sebagai argumen ke parameter ref harus diinisialisasi terlebih dahulu. Kode program di bawah ini akan menghasilkan eror karena variabel str1
dan str2
tidak diinisialisasi terlebih dahulu sebelum diberikan sebagai argumen.
string str1, str2;
TukarString(ref str1, ref str2);
Pengubah Parameter out
Selain ref
, pengubah parameter pada method di C# yang bisa kita gunakan adalah out
.
Sama halnya ketika menggunakan pengubah parameter ref
, kita juga mengharapkan sebuah variabel mendapatkan nilai baru ketika menggunakan parameter out
.
Kode program di bawah ini mendemonstrasikan bagaimana menggunakan pengubah parameter out
pada sebuah method.
static void Penambahan(int x, int y, out int hasil)
{
hasil = x + y;
}
Untuk menggunakan (memanggil) method tersebut, kita bisa menambahkan kode program di bawah ini di dalam method Main()
.
int angka1 = 10, angka2 = 15;
int hasil;
Penambahan(angka1, angka2, out hasil);
Console.WriteLine($"{angka1} + {angka2} = {hasil}");
// Output: 10 + 15 = 25
Kode program di atas bisa kita ringkas dengan cara mendeklarasikan variabel hasil
langsung pada argumennya seperti yang ditunjukkan di baris ketiga kode program di bawah ini.
int angka1 = 10, angka2 = 15;
Penambahan(angka1, angka2, out int hasil); // Perhatikan baris ini!
Console.WriteLine($"{angka1} + {angka2} = {hasil}");
Sampai di sini, mungkin timbul pertanyaan dalam benak Anda. Bukannya kita bisa menggunakan nilai balik dengan kata kunci return
daripada menggunakan pengubah parameter out
untuk mendapatkan hasil dari method Penambahan()
?
Benar sekali! Namun dengan menggunakan kata kunci return
berarti kita hanya bisa mendapatkan satu nilai saja. Bagaimana jika kita menginginkan sebuah method yang bisa memberi kita lebih dari satu nilai?
Jika Anda ingat materi sebelumnya tentang konversi tipe data, kita menggunakan method Int32.TryParse() untuk melakukan parsing sebuah nilai string ke nilai integer. Method tersebut mempunyai definisi seperti berikut ini.
public static bool TryParse (string s, out int result);
Dari definisi di atas, method ini memiliki nilai balik berupa tipe bool
untuk menyatakan proses parsing telah berhasil atau gagal. Selain itu, method ini juga memiliki parameter out untuk menampung hasil parsing berupa nilai int
yang selanjutnya bisa kita gunakan.
Hal Yang Perlu Diperhatikan Dari Penggunaan Pengubah Parameter out
Ada satu hal mendasar mengenai parameter out yang perlu kita perhatikan. Jika menggunakan parameter ref mewajibkan kita menginisialisasi sebuah variabel terlebih dahulu sebelum memberikannya sebagai argumen, kita tidak perlu melakukannya ketika menggunakan parameter out.
Justru parameter out ini sebaiknya hanya menerima variabel yang belum diinisialisasi. Apabila kita memberikan sebuah variabel yang telah diinisialisasi sebagai argumen, parameter out akan mengabaikannya dan menganggap bahwa variabel tersebut tidak memiliki nilai apapun.
using System;
namespace PengubahParameter
{
class Program
{
static void Main(string[] args)
{
// Deklarasi dan inisialisasi variabel hasil
int hasil = 0;
// Berikan variabel hasil dengan nilai 10 sebagai argumen
NaikkanNilai(10, out hasil);
}
static void NaikkanNilai(int kenaikan, out int hasil)
{
// Eror! Parameter out hasil tidak pernah diinisialisasi.
hasil = hasil + kenaikan;
}
}
}
Jika Anda perhatikan kode program di atas, kita mendeklarasikan dan menginisialisasi variabel hasil
dengan nilai 0, kemudian kita memberikan variabel tersebut ke method NaikkanNilai()
sebagai argumen.
Di dalam blok method NaikkanNilai()
, kita mencoba menggunakan parameter hasil
dengan asumsi bahwa parameter tersebut telah mendapatkan nilai dari argumennya, yaitu 0, untuk menaikkan nilainya sebesar 10.
Namun, kita malah mendapat protes dari compiler karena kita menggunakan parameter hasil
tanpa melakukan inisialisasi terlebih dahulu. Bukannya parameter hasil
seharusnya sudah diinisialisasi dengan nilai 0 yang didapat dari argumennya?
Apabila kita menggunakan pengubah parameter out
, maka kita hanya bisa menerima sebuah nilai dari parameter tersebut, tidak sebaliknya. Berbeda dengan parameter ref yang bisa menerima sekaligus memberi kita sebuah nilai.
Pengubah Parameter params
Satu lagi pengubah parameter pada method di C# yang bisa kita gunakan adalah params
.
Apa kegunaannya? Perhatikan kode program di bawah ini di mana kita memberikan sebuah array sebagai argumen untuk suatu method.
using System;
namespace ParameterParams
{
class Program
{
static void Main(string[] args)
{
double[] doubleArray = { 5.2, 8.3, 12.1, 96.4 };
Console.WriteLine("Nilai rata-rata dari doubleArray: {0}", HitungRataRata(doubleArray));
}
static double HitungRataRata(double[] nilai)
{
double jumlah = 0;
if (nilai.Length == 0)
return jumlah;
for (int i = 0; i < nilai.Length; i++)
jumlah += nilai[i];
return (jumlah / nilai.Length);
}
}
}
Method HitungRataRata()
di atas akan menghitung rata-rata dari semua nilai elemen pada variabel array doubleArray
, sehingga akan menghasilkan keluaran seperti di bawah ini.
Nilai rata-rata dari doubleArray: 30.5
Karena method HitungRataRata()
menerima argumen dari tipe double[]
, tanpa mendeklarasikan sebuah variabel array terlebih dahulu seperti doubleArray
, kita akan coba memberikan deret angka dari tipe double
, yaitu 5.2, 8.3, 12.1, 96.4 langsung sebagai argumen.
static void Main(string[] args)
{
Console.WriteLine("Nilai rata-rata dari doubleArray: {0}", HitungRataRata(5.2, 8.3, 12.1, 96.4));
}
Sayangnya usaha kita di atas menghasilkan eror. Sebelumnya, compiler akan mencoba mencari method HitungRataRata()
yang bisa menerima empat argumen (disebut dengan method overloading yang bisa Anda pelajari di pemrograman berorientasi objek). Namun karena compiler tidak dapat menemukan method tersebut, kita akan mendapat pesan eror.
Agar kita bisa memberi deret angka seperti di atas sebagai argumen, kita hanya perlu melakukan sedikit modifikasi pada parameter nilai
, yaitu dengan menambahkan pengubah parameter params
seperti di bawah ini.
static double HitungRataRata(params double[] nilai)
Dengan menambahkan pengubah parameter params
seperti di atas, kita bisa memberikan berapapun deret angka sebagai argumen untuk method HitungRataRata()
.
Kode program di bawah ini menggunakan 6 angka dari tipe double
sebagai argumen method HitungRataRata()
tanpa menghasilkan eror.
Console.WriteLine("Nilai rata-rata dari doubleArray: {0}", HitungRataRata(5.2, 8.3, 12.1, 96.4, 10.5, 23.5));
Apabila dijalankan, kode program di atas akan menghasilkan keluaran seperti berikut ini.
Nilai rata-rata dari doubleArray: 26
Penutup
Pada materi kali ini kita telah mempelajari beberapa pengubah parameter pada method di C#, seperti ref
, out
, dan params
.
Dengan menggunakan pengubah parameter, kita bisa lebih leluasa menentukan bagaimana sebuah parameter pada suatu method menerima sebuah argumen.
Itu saja materi kita kali ini. Jika Anda merasa kesulitan dalam memahami materi ini, jangan menyerah! Tulis kesulitan atau pertanyaan Anda di kolom komentar, saya akan membantu.
Selamat belajar!