Kaedah Sambungan C#: Mengapa Parameter Pertama Tidak Boleh ref
(Kebanyakannya)
Kaedah sambungan menambah kefungsian pada jenis sedia ada dengan elegan tanpa mengubah kod sumbernya. Walau bagaimanapun, had utama wujud: parameter pertama—mewakili instance kaedah beroperasi—tidak boleh menjadi parameter ref
(dengan pengecualian yang dinyatakan di bawah).
Sebab di sebalik Sekatan
Kata kunci ref
membenarkan kaedah mengubah suai secara langsung nilai pembolehubah yang diluluskan sebagai hujah. Dalam panggilan kaedah standard, ini boleh diterima dengan sempurna. Tetapi dengan kaedah sambungan, parameter pertama secara tersirat mewakili objek sambungan dipanggil. Membuat parameter ini ref
secara asasnya akan mengubah cara kaedah sambungan berfungsi.
Kaedah sambungan melanjutkan gelagat sesuatu jenis; ia tidak menggantikan atau mencipta kejadian baharu. Membenarkan parameter ref
pada hujah pertama akan membenarkan kaedah sambungan menggantikan objek asal dengan objek yang berbeza sama sekali, memecahkan konsep teras kaedah sambungan.
Contoh Ilustrasi
Pertimbangkan kaedah biasa:
<code class="language-csharp">public static void Modify(ref MyClass obj, MyClass newObj) { obj = newObj; //Directly replaces the original object }</code>
Sekarang, bayangkan kaedah sambungan analog (secara hipotesis dibenarkan):
<code class="language-csharp">public static void ModifyExtension(this ref MyClass obj, MyClass newObj) { obj = newObj; //Would replace the original object }</code>
Kaedah sambungan hipotetikal ini tidak akan mengubah suai obj
asal tetapi sebaliknya akan menetapkan objek baharu kepada pembolehubah yang merujuknya. Tingkah laku ini tidak konsisten dengan tujuan kaedah sambungan yang dimaksudkan.
C# 7.2 dan Jenis Nilai: Pengecualian
Walaupun sekatan biasanya berlaku untuk jenis rujukan (kelas, antara muka), C# 7.2 memperkenalkan pengecualian untuk jenis nilai (struktur). Dengan struct, menggunakan ref
pada parameter pertama adalah dibenarkan.
Ini membolehkan mencipta kaedah sambungan yang boleh mengubah suai keadaan dalaman sesuatu struct. Walau bagaimanapun, adalah penting untuk mengingati pengecualian ini hanya digunakan pada jenis nilai, bukan jenis rujukan. Prinsip teras untuk mengekalkan contoh asal kekal untuk jenis rujukan.
Atas ialah kandungan terperinci Mengapa Parameter Pertama Kaedah Sambungan C# Tidak Boleh Menjadi Parameter `ref`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!