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:

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

text
10
99
50

Mari kita telaah baris demi baris:

  1. Baris 3 (int[] salinan = (int[])asal.Clone();): Method Clone membuat objek array baru berisi salinan seluruh elemen; cast (int[]) dibutuhkan karena Clone mengembalikan object.
  2. Baris 4-6: salinan[0] diubah menjadi 99, dan asal[0] tetap 10 karena keduanya objek yang berbeda.
  3. Baris 9 (int[] alias = asal;): Tidak ada penyalinan isi di sini; alias dan asal menunjuk objek array yang sama.
  4. Baris 10-11: alias[0] = 50 mengubah objek yang sama, sehingga asal[0] ikut terbaca 50.

Menyalin Isi dengan CopyTo #

Method CopyTo menyalin elemen ke array lain mulai indeks tertentu. Array tujuan harus cukup panjang menampung seluruh elemen sumber:

csharp
int[] salinSebagian = new int[5];
asal.CopyTo(salinSebagian, 1);
Console.WriteLine(string.Join(" ", salinSebagian));

Output yang Dihasilkan:

text
0 50 20 30 0

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

csharp
Console.WriteLine(asal == salinan);

int[] dataSama = { 50, 20, 30 };
Console.WriteLine(asal.SequenceEqual(dataSama));

Output yang Dihasilkan:

text
False
True

asal == 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.