Kode seperti teks.ToUpper() terlihat seperti mengubah isi variabel, padahal kenyataannya tidak. Tipe string di C# bersifat immutable: setelah objek string dibuat, isinya tidak pernah berubah. Runtime hanya membuat objek string baru setiap kali operasi teks dijalankan. Sifat ini mempengaruhi cara kita menulis kode sehari-hari, mulai dari menampung hasil method hingga mengukur biaya penggabungan teks dalam loop.
Bukti Operasi Menghasilkan String Baru #
Method ReferenceEquals melaporkan apakah dua variabel menunjuk objek yang sama persis di memori. Dengan method tersebut, kita bisa membuktikan bahwa hasil operasi teks adalah objek baru:
string nama = "Siti Rahma";
string atas = nama.ToUpper();
Console.WriteLine(nama);
Console.WriteLine(atas);
Console.WriteLine(ReferenceEquals(nama, atas));
string sambungan = nama + ", S.Pd";
Console.WriteLine(ReferenceEquals(nama, sambungan));Output yang Dihasilkan:
Siti Rahma
SITI RAHMA
False
FalseMari kita telaah baris demi baris:
- Baris 2 (
nama.ToUpper()): Method mengembalikan string baru berisiSITI RAHMA; string asal"Siti Rahma"tidak tersentuh, sehingga baris 4 masih mencetak bentuk aslinya. - Baris 5 (
ReferenceEquals(nama, atas)): HasilFalsemenunjukkan keduanya objek berbeda di memori. - Baris 7 (
nama + ", S.Pd"): Operator+juga menyusun string baru, bukan menambah isi string lama; perbandingan referensinya kembaliFalse.
Perbandingan == pada String #
Meskipun string adalah tipe referensi, operator == pada string membandingkan isinya, bukan alamatnya:
string a = "Budi";
string b = "Budi";
Console.WriteLine(a == b);
Console.WriteLine(ReferenceEquals(a, b));Output yang Dihasilkan:
True
Truea == b menghasilkan True karena isi kedua variabel sama. Hasil ReferenceEquals yang juga True berasal dari string interning: compiler menempatkan literal yang sama ke satu objek bersama, sehingga dua literal "Budi" menunjuk satu objek. Perilaku ini khusus literal; string hasil operasi runtime tidak ikut diinterning secara otomatis.
Pola Penulisan Ulang #
Karena operasi mengembalikan string baru, hasil method yang tidak ditampung akan terbuang. Pola yang benar adalah menugaskan kembali hasilnya ke variabel:
string kata = "gorengan";
kata.Replace("goreng", "bak");
Console.WriteLine(kata);
kata = kata.Replace("goreng", "bak");
Console.WriteLine(kata);Output yang Dihasilkan:
gorengan
bakanPemanggilan pertama kata.Replace(...) menghasilkan "bakan", tetapi hasilnya tidak ditampung, sehingga kata tetap "gorengan". Pemanggilan kedua menugaskan hasilnya kembali ke kata, dan pencetakan menampilkan "bakan".