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

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

Linda Hamilton
Linda Hamiltonasal
2025-01-24 06:56:10664semak imbas

Why Does C# String Behavior Seem to Contradict Its Reference Type Nature?

Mengapa rentetan C# tidak berfungsi seperti jenis rujukan dalam beberapa kes?

Walaupun rentetan ditakrifkan sebagai jenis rujukan dalam C#, ia berkelakuan berbeza dalam senario kod tertentu. Pertimbangkan kod berikut:

<code class="language-csharp">class Test
{
    public static void Main()
    {
        string test = "传递前";
        Console.WriteLine(test);
        TestI(test);
        Console.WriteLine(test);
    }

    public static void TestI(string test)
    {
        test = "传递后";
    }
}</code>

Output yang dijangkakan bagi kod ini ialah "sebelum lulus" dan "selepas lulus", mencerminkan sifat rujukan rentetan. Walau bagaimanapun, output sebenar ialah kedua-dua baris adalah "lulus sebelum", menunjukkan bahawa ia diluluskan oleh nilai dan bukannya rujukan.

Sebab perbezaan ini adalah cara rujukan dikendalikan dalam C#. Jenis rentetan sememangnya jenis rujukan, tetapi apabila rujukan diluluskan sebagai parameter kepada kaedah, ia diluluskan oleh nilai. Ini bermakna salinan rujukan dibuat dan bukannya rujukan kepada nilai asal.

Jika anda ingin menghantar rentetan melalui rujukan, anda mesti menggunakan kata kunci "ref":

<code class="language-csharp">public static void TestI(ref string test)</code>

Ini memastikan kaedah menerima rujukan kepada rentetan asal, membenarkan pengubahsuaian yang dibuat dalam kaedah ditunjukkan dalam kod panggilan.

Adalah penting untuk membezakan antara menukar nilai objek yang dirujuk dan menukar rujukan itu sendiri. Rentetan tidak boleh diubah dan tidak boleh diubah suai, tetapi rujukan boleh ditugaskan semula kepada rentetan yang berbeza.

Untuk menunjukkan dengan lebih jelas, mari kita gunakan contoh berbeza yang melibatkan jenis boleh ubah, StringBuilder:

<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("修改");
    }
}</code>

Dalam kes ini, output akan "" dan "diubah suai", yang menunjukkan bahawa pengubahsuaian yang dibuat dalam kaedah ditunjukkan dalam kod panggilan. Ini kerana StringBuilder ialah jenis rujukan boleh ubah.

Atas ialah kandungan terperinci Mengapa Kelakuan Rentetan C# Nampaknya Bercanggah dengan Sifat Jenis Rujukannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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