Cast (tipe)nilai sudah kita pakai untuk angka pada bab Konversi Tipe: cast numerik mengubah representasi nilai, misalnya 87.75 menjadi 87. Cast punya wajah lain pada hierarki tipe berbasis object: cast di sana tidak mengubah object sama sekali, melainkan mengubah sudut pandang tipe dari sebuah reference. Bab ini fokus pada wajah kedua tersebut, yang bekerja pada reference type.
Upcasting: Menyimpan Turunan sebagai Induk #
string adalah turunan dari object. Menyimpan string ke variable object bergerak naik dalam hierarki (upcasting) dan berjalan tanpa cast eksplisit:
string teks = "Belajar C#";
object penyimpan = teks;
Console.WriteLine(penyimpan);
Console.WriteLine(penyimpan.GetType());Output yang Dihasilkan:
Belajar C#
System.StringMari kita telaah:
- Baris 2 (
object penyimpan = teks;): Upcasting berjalan otomatis; variableobjectmenampung reference ke object string yang sama. - Baris 4: Nilai tetap terbaca penuh lewat variable
object. - Baris 5 (
penyimpan.GetType()):GetType()membuktikan object yang tersimpan tetapSystem.String; upcasting tidak mengubah object, hanya melebarkan sudut pandang variable.
Downcasting: Kembali ke Tipe Turunan #
Bergerak turun dari object ke tipe turunannya (downcasting) menuntut cast eksplisit, karena tidak setiap object berisi string:
object penyimpan = "Belajar C#";
string kembali = (string)penyimpan;
Console.WriteLine(kembali);Output yang Dihasilkan:
Belajar C#Compiler menerima downcasting karena programmer menyatakannya secara eksplisit; runtime yang memverifikasi kecocokan tipe. Ketika verifikasi gagal, program berhenti dengan exception:
object angka = 2025;
string teksSalah = (string)angka;Output yang Dihasilkan:
Unhandled exception. System.InvalidCastException: Unable to cast object of type 'System.Int32' to type 'System.String'.
at Program.<Main>$(String[] args) in Program.cs:line 2Runtime menemukan object berisi System.Int32, bukan System.String, sehingga InvalidCastException diangkat dan program berhenti. Perhatikan: cast reference tidak mengubah isi object; cast hanya menyatakan sudut pandang, dan runtime menolak sudut pandang yang tidak sesuai.
Operator as dan is #
Cast yang gagal menghentikan program. Dua operator memberi jalur yang lebih terkendali: as menghasilkan null bila tipe tidak cocok, sedangkan is melaporkan kecocokan sebagai bool:
object penyimpan = "Belajar C#";
object angka = 2025;
Console.WriteLine(angka is string);
Console.WriteLine(angka is int);
Console.WriteLine(penyimpan is string);
Console.WriteLine(angka as string == null);
string kembali = (string)penyimpan;
Console.WriteLine(kembali);
if (angka is int bilangan)
{
Console.WriteLine(bilangan * 2);
}Output yang Dihasilkan:
False
True
True
True
Belajar C#
4050Mari kita telaah:
- Baris 4-6 (operator
is):ismemeriksa tipe sebenarnya dari object:2025bukan string tetapi int, sedangkan object string lolos pemeriksaanis string. - Baris 7 (
angka as string == null):asmenghasilkannullkarenaangkabukan string; perbandingan dengannullmenghasilkanTrue. - Baris 9-10: Downcasting klasik berhasil karena object memang string.
- Baris 12-15 (
angka is int bilangan): Type pattern menggabungkan pemeriksaan dan penamaan: bilaangkabertipeint, nilai itu tersalin ke variable barubilangan, lalu blok mengalikan nilainya menjadi4050.
Blok if dan pola kondisi lainnya dibedah pada section Control Flow; di sini cukup catat pola obj is Tipe namaVariable sebagai cara aman memeriksa sekaligus mengambil nilai.
Memilih Teknik Cast #
- Cast
(Tipe)nilai: kecocokan tipe sudah pasti; kegagalan menghentikan program. - Operator
as: ketidakcocokan diterima sebagainull, tanpa exception. - Type pattern
obj is Tipe t: pemeriksaan dan pengambilan nilai berlangsung sekaligus. - Konversi antar tipe numerik: kembali ke bab Konversi Tipe; cast numerik mengubah representasi nilai, sedangkan cast reference tidak menyentuh object.