Rumah >pembangunan bahagian belakang >C++ >Mengapa Tidak Menetapkan Parameter Rujukan kepada Medan Kelas Mengekalkan Rujukan dalam C#?

Mengapa Tidak Menetapkan Parameter Rujukan kepada Medan Kelas Mengekalkan Rujukan dalam C#?

DDD
DDDasal
2025-01-05 21:42:39625semak imbas

Why Doesn't Assigning a Reference Parameter to a Class Field Maintain the Reference in 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!

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