Rumah > pembangunan bahagian belakang > C++ > Mengapa Kelakuan Rentetan C# Nampaknya Bercanggah dengan Klasifikasi Jenis Rujukannya?

Mengapa Kelakuan Rentetan C# Nampaknya Bercanggah dengan Klasifikasi Jenis Rujukannya?

Linda Hamilton
Lepaskan: 2025-01-24 07:16:09
asal
395 orang telah melayarinya

Why Does C# String Behavior Seem to Contradict its Reference Type Classification?

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan