Sekalian jawab beberapa pertanyaannya stash, kepanjangan ngetik di BBM
Function/Sub = MethodKalau di VB kita kenal dua jenis fungsi, yaitu function (yang mengembalikan suatu nilai) dan sub (yang tidak mengembalikan apa-apa), di C# semuanya dipanggil dengan satu nama: method (sebenarnya di VB pun sub adalah function). Cara bikinnya sama saja seperti di VB, tulis di dalam blok class.
Sintaks untuk Sub:
void NamaMethod([tipe param1, tipe param2, ...])
{
// isi method di sini...
// return; bisa dipakai kalau mau segera keluar dari method tanpa harus menjalankan baris sisanya (mirip dengan break pada loop). Walaupun namanya return, dia tidak mengembalikan apa-apa di method yang bertipe void (dan ini sah)
}
// Contoh (agak jarang sih method yang tipenya void...)
void ConnectToDb(string username, string password)
{
// asumsi connection string dan objek conn sudah ada
if(conn != null) conn = new SqlConnection(connectionString);
// blok Try-Catch-Finally di C# kurang lebih sama
try
{
conn.Open();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
if(conn.State == ConnectionState.Open) conn.Close();
}
}
Untuk function, tinggal pindahkan tipe return value (setelah As terakhir) ke paling depan (sebelum nama fungsi). Jadi, kalau di VB bentuknya begini:
Function NamaFungsi([param1 As tipe, param2 As tipe [= nilaiDasar], ...]) As tipeReturnValue
' isi fungsi
Return myValue
End Function
di C# jadi begini:
tipeReturnValue NamaFungsi([tipe param1, tipe param2, ...])
{
// isi fungsi
return myValue;
}
// Contoh: fungsi menghitung luas persegi panjang
double HitungLuas(double panjang, double lebar)
{
return panjang * lebar;
}
// Sayangnya, C# tidak punya fitur default value untuk parameter, jadi harus diakali dengan bantuan overload: menulis ulang method yang sama tapi dengan signature (deklarasi) yang berbeda, seperti ini.
// Hitung luas persegi menggunakan bantuan method HitungLuas
double HitungLuas(double sisi)
{
return HitungLuas(sisi, sisi);
}
Untuk persamaan ByVal dan ByRef di C# aku tinggalkan dulu untuk sementara sampai dibutuhkan lagi.
EDIT:
Akhirnya butuh juga...
ByRef di VB mengizinkan kita mengubah nilai parameter suatu function/sub dan perubahannya tercermin di argumen. Bingung? Coba sub ini deh:
Sub CobaUbah(ByRef angka As Integer)
angka = 10
End Sub
' Lalu lakukan ini, misalkan di Form_Load():
Dim intAngka As Integer
intAngka = 5;
CobaUbah(intAngka)
MessageBox.Show(intAngka) ' hasilnya 10 bukan 5
Proses
passing argumen seperti ini dinamakan
passing by reference (makanya namanya
ByRef). Proses satunya bernama
passing by value, yang merupakan sifat dasar argumen kalau tidak ada kata bantu apa-apa (bahkan di VB ByVal pun tidak harus ditulis). Passing by value tidak menyebabkan argumen berubah kalau parameter berubah. Terminologi lebih lanjut bagi yang tertarik bisa dibaca di
MSDN.
C# juga punya fitur passing by reference, namanya
ref dan
out. Nah lho... bedanya apa? Kalau parameter didefinisikan sebagai
ref, argumen yang mau diberikan ke method itu harus sudah punya nilai terlebih dahulu, tapi masalah nanti parameter itu bakal berubah atau tidak di dalam method, ref tidak peduli. Sebaliknya, parameter yang bersifat
out harus berubah di dalam method nilainya, tapi argumennya tidak harus punya nilai terlebih dahulu. Bingung ya

contoh saja deh:
// Contoh parameter ref
void Method1(ref int angka)
{
angka = 2; // coba comment baris ini dan lihat hasilnya
}
// Contoh parameter out
// Method ini terpaksa dipisah dari Method1 karena C# tidak mengizinkan overload kalau parameternya hanya berbeda ref/out
void Method2(out int angka)
{
angka = 2; // coba comment baris ini dan lihat hasilnya (kemungkinan besar error)
}
// Coba ini di suatu tempat, misalnya Form_Load
int x, y;
x = 5; // coba comment baris ini dan lihat hasilnya (kemungkinan besar error)
y = 10; // coba comment baris ini dan lihat hasilnya
Method1(ref x); // kata ref harus eksplisit dituliskan, kalau tidak C# akan komplain
Method2(out y); // kata out harus eksplisit dituliskan, kalau tidak C# akan komplain
// Tampilkan x dan y, lihat hasilnya
Beberapa percobaan awal akan memberikan error bahkan sebelum dijalankan (aku biasa menyebutnya "error cacing" karena muncul garis zig-zag merah atau biru mirip cacing di baris yang error), jadi silakan bereksperimen sendiri dan tentukan mana yang benar

Kalau dilihat, pemanggilan method di C# jadi tampak aneh. Benar, tapi secara eksplisit C# memberi tahu kita bahwa argumen itu ada kemungkinan nilainya berubah kalau menggunakan out/ref. Bandingkan sub ini di VB:
Sub Calculate(ByVal rate As Double, ByRef debt As Double)
debt = debt + (debt * rate / 100)
End Sub
' Manggilnya:
Calculate(lowRate, debtWithInterest)
Kalau tidak hati-hati, kita bisa lupa bahwa
debtWithInterest itu sifatnya
ByRef, akibatnya nilainya bisa diubah oleh
Calculate. Bandingkan method yang sama di C#:
void Calculate(double rate, ref double debt)
{
debt = debt + (debt * rate / 100);
}
// Manggilnya: (asumsi debtWithInterest sudah punya nilai sebelum method ini dipanggil)
Calculate(lowRate, ref debtWithInterest);
Jelas kan bahwa
debtWithInterest itu
ref sehingga bisa berubah? Ini mengurangi sakit kepala gara-gara nilai "ajaib" yang tiba-tiba mengubah suatu variabel tanpa kita sadari
