Rumah >pembangunan bahagian belakang >C++ >Kenapa jenis rujukan rentetan C#seolah -olah berkelakuan seperti jenis nilai apabila diserahkan kepada kaedah?
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!