Section Variabel dan Tipe Data memperkenalkan object sebagai induk seluruh tipe dan bab boxing-dan-unboxing menjelaskan biaya konversinya. Bab ini menuntaskan sisi lanjutan: helper statis Object.Equals dan Object.ReferenceEquals, method MemberwiseClone, serta keputusan kapan object perlu ditinggalkan demi generic. Semua perilaku berikut dapat kita uji langsung.

Tiga Helper yang Sering Dipakai #

AnggotaPerilaku
Object.Equals(a, b)Membandingkan isi dengan menghormati override Equals milik tipe a
Object.ReferenceEquals(a, b)Membandingkan identitas referensi, tidak dipengaruhi override apa pun
MemberwiseClone()Menyalin field satu per satu secara dangkal; hanya dapat dipanggil dari dalam class

Contoh: Identitas, Isi, dan Salinan #

csharp
object a = 42;
object b = 42;
Console.WriteLine(Object.Equals(a, b));
Console.WriteLine(Object.ReferenceEquals(a, b));

Tampilkan(42);
Tampilkan(4.5);
Tampilkan("Budi");
Tampilkan('A');

Laporan laporan = new Laporan { Judul = "Penjualan", Halaman = 12 };
Laporan salinan = laporan.SalinShallow();
salinan.Halaman = 20;
Console.WriteLine($"{laporan.Halaman} vs {salinan.Halaman}");
Console.WriteLine(laporan.ToString());

Output yang Dihasilkan:

text
True
False
42 | Int32
4.5 | Double
Budi | String
A | Char
12 vs 20
Verify6a.ObjectType+Laporan

Mari kita bedah baris demi baris:

  1. Object.Equals(a, b): kedua nilai berupa box Int32; override Equals milik Int32 membandingkan angka, sehingga hasilnya True.
  2. Object.ReferenceEquals(a, b): setiap penugasan 42 ke object men-boxing ke box yang berbeda, sehingga identitas referensinya False meski nilainya sama.
  3. Tampilkan(object): satu parameter object menerima int, double, string, dan char; GetType() selalu melaporkan tipe asli yang tersimpan.
  4. SalinShallow(): MemberwiseClone menyalin field ke instance baru; perubahan salinan.Halaman tidak menyentuh laporan, seperti ditunjukkan 12 vs 20.
  5. laporan.ToString(): tanpa override, ToString mengembalikan nama tipe lengkap Verify6a.ObjectType+Laporan; tanda + menandakan nested class.

Kapan Menghindari object #

Parameter atau field bertipe object meniadakan pemeriksaan tipe dan menimbulkan boxing pada setiap value type. Bila kontrak data sudah diketahui saat kompilasi, generic pada section Generics memberi pemeriksaan tipe penuh tanpa alokasi box. Simpan object untuk batas yang memang tidak bertipe, misalnya penampung campuran atau interaksi dengan API lama.