Rumah >pembangunan bahagian belakang >C++ >Kenapa jenis rujukan rentetan C#seolah -olah berkelakuan seperti jenis nilai apabila diserahkan kepada kaedah?

Kenapa jenis rujukan rentetan C#seolah -olah berkelakuan seperti jenis nilai apabila diserahkan kepada kaedah?

DDD
DDDasal
2025-01-24 07:06:10600semak imbas

Why Does C#'s String Reference Type Seem to Behave Like a Value Type When Passed to a Method?

Adakah jenis rujukan rentetan dalam C# bercanggah dengan tingkah laku kod?

Dalam C#, rentetan ialah jenis rujukan, seperti yang didokumenkan oleh MSDN. Walau bagaimanapun, kod berikut menimbulkan isu mengelirukan yang nampaknya mencabar konsep ini:

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

Bergantung pada tingkah laku jenis rujukan, seseorang akan menjangkakan konsol akan mengeluarkan "sebelum lulus" dan kemudian "selepas lulus". Ini kerana rentetan test diluluskan dengan merujuk kepada kaedah TestI dan sebarang perubahan yang dibuat pada rentetan dalam kaedah itu harus dipantulkan kembali kepada pemanggil.

Walau bagaimanapun, kod itu sebenarnya menghasilkan output: "sebelum lulus" "sebelum lulus", yang menunjukkan bahawa rentetan itu diluluskan oleh nilai. Tingkah laku ini bercanggah dengan jenis rujukan yang didokumenkan untuk rentetan dalam C#.

Salah Faham: Pass by reference vs. pass by reference

Kekeliruan timbul daripada perbezaan halus antara menghantar rujukan mengikut nilai dan menghantar objek melalui rujukan. Dalam C#, parameter sentiasa diluluskan mengikut nilai, tanpa mengira jenis datanya.

Apabila jenis rujukan dihantar kepada kaedah, nilai yang diluluskan itu sendiri adalah rujukan, oleh itu istilah "laluan rujukan". Walau bagaimanapun, ini tidak bermakna bahawa objek yang dirujuk oleh pembolehubah juga diluluskan oleh rujukan.

Dalam contoh di atas, nilai yang dihantar kepada kaedah TestI ialah salinan rujukan kepada rentetan "sebelum lulus". Sebarang perubahan yang dibuat pada salinan rujukan ini dalam kaedah tidak akan menjejaskan rujukan asal di luar kaedah.

Rujukan lulus dengan rujukan: kata kunci ref

Untuk benar-benar lulus jenis rujukan dengan rujukan, kata kunci ref mesti digunakan. Kata kunci ini menunjukkan bahawa parameter adalah rujukan kepada pembolehubah sedia ada dan sebarang perubahan yang dibuat pada parameter dalam kaedah akan ditunjukkan dalam pembolehubah asal.

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

    public static void TestI(ref string test)
    {
        test = "after passing";
    }
}</code>

Dengan memasukkan kata kunci ref, kod kini berjalan seperti yang diharapkan, mengeluarkan "sebelum lulus" dan "selepas lulus" kerana kaedah TestI mengubah suai rentetan asal yang dirujuk oleh pembolehubah test.

Atas ialah kandungan terperinci Kenapa jenis rujukan rentetan C#seolah -olah berkelakuan seperti jenis nilai apabila diserahkan kepada kaedah?. 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