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 #
| Anggota | Perilaku |
|---|---|
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 #
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:
True
False
42 | Int32
4.5 | Double
Budi | String
A | Char
12 vs 20
Verify6a.ObjectType+LaporanMari kita bedah baris demi baris:
Object.Equals(a, b): kedua nilai berupa boxInt32; overrideEqualsmilikInt32membandingkan angka, sehingga hasilnyaTrue.Object.ReferenceEquals(a, b): setiap penugasan42keobjectmen-boxing ke box yang berbeda, sehingga identitas referensinyaFalsemeski nilainya sama.Tampilkan(object): satu parameterobjectmenerimaint,double,string, danchar;GetType()selalu melaporkan tipe asli yang tersimpan.SalinShallow():MemberwiseClonemenyalin field ke instance baru; perubahansalinan.Halamantidak menyentuhlaporan, seperti ditunjukkan12 vs 20.laporan.ToString(): tanpa override,ToStringmengembalikan nama tipe lengkapVerify6a.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.