首頁 >後端開發 >C++ >為什麼在 C# 中將引用參數指派給類別欄位不會維護參考?

為什麼在 C# 中將引用參數指派給類別欄位不會維護參考?

DDD
DDD原創
2025-01-05 21:42:39591瀏覽

Why Doesn't Assigning a Reference Parameter to a Class Field Maintain the Reference in C#?

在 C# 中引用類別欄位

在 C# 中,透過引用傳遞參數允許直接修改原始變數。但是,將引用參數指派給類別欄位時,可能不會發生預期的行為。

考慮以下程式碼:

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();

執行時,輸出為“X(更新者)” Y)”,而不是預期的“X (Updated By Y) (Updated By Z )」。

這是因為將引用參數分配給類別字段打破參考。為了維護引用,一個解決方案是使用getter 和setter:

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

在此範例中,'x' 是一個可以取得和設定'y' 值的對象,維護之間的引用他們。引用返回方法,但它們在C# 中尚不可用。

以上是為什麼在 C# 中將引用參數指派給類別欄位不會維護參考?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn