Pengecualian "jenis rujukan" rentetan C#
Dokumentasi C# menyatakan bahawa rentetan ialah jenis rujukan. Walau bagaimanapun, kod di bawah menunjukkan tingkah laku yang mengelirukan:
<code class="language-csharp">class Test { public static void Main() { string test = "before passing"; Console.WriteLine(test); TestI(test); Console.WriteLine(test); } public static void TestI(string test) { test = "after passing"; } }</code>
Mengikut takrifan jenis rujukan, output hendaklah "sebelum lulus" dan "selepas lulus", yang menunjukkan bahawa rentetan telah diubah suai dalam kaedah TestI. Walau bagaimanapun, output sebenar ialah "sebelum lulus" dan "sebelum lulus", yang menunjukkan bahawa rentetan diluluskan oleh nilai dan bukannya rujukan.
Untuk memahami pengecualian ini, kita perlu menyelidiki kehalusan jenis rujukan. Walaupun rentetan secara teknikal adalah jenis rujukan, rujukan itu sendiri diluluskan oleh nilai. Meluluskan rujukan mengikut nilai bermakna pembolehubah yang mengandungi rujukan disalin, bukan objek itu sendiri. Oleh itu, sebarang perubahan pada rujukan di dalam kaedah tidak akan menjejaskan rentetan asal di luar kaedah.
Untuk membetulkan ini dan membenarkan rentetan diubah suai, kita perlu menghantar rujukan dengan rujukan menggunakan kata kunci "ref":
<code class="language-csharp">public static void TestI(ref string test)</code>
Sebarang perubahan pada rujukan dalam kaedah TestI kini akan ditunjukkan dalam rentetan asal di luar kaedah.
Adalah penting untuk ambil perhatian perbezaan antara menukar objek yang dirujuk oleh pembolehubah dan menukar rujukan itu sendiri. Rentetan tidak boleh diubah, yang bermaksud kandungannya tidak boleh diubah suai. Walau bagaimanapun, kita boleh menetapkan semula pembolehubah rujukan untuk menunjuk kepada rentetan yang berbeza, seperti yang ditunjukkan dalam contoh StringBuilder berikut:
<code class="language-csharp">using System.Text; class Test { public static void Main() { StringBuilder test = new StringBuilder(); Console.WriteLine(test); TestI(test); Console.WriteLine(test); } public static void TestI(StringBuilder test) { test.Append("changing"); } }</code>
Dalam contoh ini, bukannya menukar nilai parameter "ujian", kami menukar data dalam objek yang dirujuk.
Atas ialah kandungan terperinci Mengapa Kelakuan Rentetan C# Nampaknya Bercanggah dengan Klasifikasi Jenis Rujukannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!