Sebuah program sering perlu mengirim salinan data ke fungsi lain agar data asal tetap utuh. Pada array, penugasan biasa tidak menyalin isi, melainkan hanya menyalin referensi ke objek array yang sama. Kesalahpahaman di titik ini menjadi sumber bug yang sering dijumpai pemula, sehingga bab ini membuktikannya dengan contoh yang bisa dijalankan.
Penugasan Menyalin Referensi #
Variabel array menyimpan alamat objek array, bukan isi elemennya. Dua variabel yang menunjuk objek yang sama akan saling mempengaruhi:
int[] asal = { 10, 20, 30 };
int[] salinan = (int[])asal.Clone();
salinan[0] = 99;
Console.WriteLine(asal[0]);
Console.WriteLine(salinan[0]);
int[] alias = asal;
alias[0] = 50;
Console.WriteLine(asal[0]);Output yang Dihasilkan:
10
99
50Mari kita telaah baris demi baris:
- Baris 3 (
int[] salinan = (int[])asal.Clone();): MethodClonemembuat objek array baru berisi salinan seluruh elemen; cast(int[])dibutuhkan karenaClonemengembalikanobject. - Baris 4-6:
salinan[0]diubah menjadi99, danasal[0]tetap10karena keduanya objek yang berbeda. - Baris 9 (
int[] alias = asal;): Tidak ada penyalinan isi di sini;aliasdanasalmenunjuk objek array yang sama. - Baris 10-11:
alias[0] = 50mengubah objek yang sama, sehinggaasal[0]ikut terbaca50.
Menyalin Isi dengan CopyTo #
Method CopyTo menyalin elemen ke array lain mulai indeks tertentu. Array tujuan harus cukup panjang menampung seluruh elemen sumber:
int[] salinSebagian = new int[5];
asal.CopyTo(salinSebagian, 1);
Console.WriteLine(string.Join(" ", salinSebagian));Output yang Dihasilkan:
0 50 20 30 0Array tujuan berukuran lima, sedangkan sumber berisi tiga elemen. CopyTo mulai menulis pada indeks 1, sehingga elemen 50, 20, 30 menempati posisi 1 sampai 3, dan posisi 0 serta 4 tetap 0.
Kelas Array juga menyediakan bentuk lebih fleksibel bernama Array.Copy(sumber, tujuan, jumlah), yang bisa menyalin sebagian elemen dan bekerja pada array tipe apa pun. Untuk kebutuhan harian, Clone menyalin seluruh array, sedangkan CopyTo dan Array.Copy cocok saat penyalinan parsial atau penempatan tertentu dibutuhkan.
Membandingkan Dua Array #
Operator == pada array membandingkan referensi, bukan isi. Untuk membandingkan isi elemen demi elemen, gunakan method SequenceEqual dari LINQ yang dibahas lebih lanjut pada section koleksi:
Console.WriteLine(asal == salinan);
int[] dataSama = { 50, 20, 30 };
Console.WriteLine(asal.SequenceEqual(dataSama));Output yang Dihasilkan:
False
Trueasal == salinan menghasilkan False karena keduanya objek berbeda, meskipun isinya mungkin sama. Sebaliknya, SequenceEqual membandingkan panjang dan tiap elemen: array asal berisi 50, 20, 30, sama persis dengan dataSama, sehingga hasilnya True.