Rumah >pembangunan bahagian belakang >C++ >Mengapa Tidak Menetapkan Parameter Rujukan kepada Medan Kelas Mengekalkan Rujukan dalam C#?
Merujuk Medan Kelas dalam C#
Dalam C#, menghantar parameter melalui rujukan membenarkan pengubahsuaian langsung pembolehubah asal. Walau bagaimanapun, apabila menetapkan parameter rujukan kepada medan kelas, tingkah laku yang dijangkakan mungkin tidak berlaku.
Pertimbangkan kod berikut:
public class X { public X() { string example = "X"; new Y(ref example); new Z(ref example); System.Diagnostics.Debug.WriteLine(example); } } public class Y { public Y(ref string example) { example += " (Updated By Y)"; } } public class Z { private string _Example; public Z(ref string example) { this._Example = example; this._Example += " (Updated By Z)"; } } var x = new X();
Setelah pelaksanaan, output ialah "X (Dikemaskini Oleh Y)", bukan "X (Dikemas kini Oleh Y) (Dikemas kini Oleh Z)" seperti yang dijangkakan.
Ini kerana menugaskan parameter rujukan kepada medan kelas memecahkan rujukan. Untuk mengekalkan rujukan, penyelesaian adalah menggunakan pengambil dan penetap:
sealed class Ref<T> { private readonly Func<T> getter; private readonly Action<T> setter; public Ref(Func<T> getter, Action<T> setter) { this.getter = getter; this.setter = setter; } public T Value { get { return getter(); } set { setter(value); } } } Ref<int> x; void M() { int y = 123; x = new Ref<int>(() => y, z => { y = z; }); x.Value = 456; Console.WriteLine(y); // 456 -- setting x.Value changes y. }
Dalam contoh ini, 'x' ialah objek yang boleh mendapatkan dan menetapkan nilai 'y', mengekalkan rujukan antara mereka. Ambil perhatian bahawa walaupun rujukan setempat dan kaedah pengembalian semula disokong dalam CLR, kaedah tersebut belum tersedia dalam C#.
Atas ialah kandungan terperinci Mengapa Tidak Menetapkan Parameter Rujukan kepada Medan Kelas Mengekalkan Rujukan dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!