首頁 >後端開發 >C++ >為什麼不能透過引用來分配 C# 類別字段,以及如何解決這個問題?

為什麼不能透過引用來分配 C# 類別字段,以及如何解決這個問題?

DDD
DDD原創
2025-01-05 22:01:42399瀏覽

Why Can't C# Class Fields Be Assigned by Reference, and How Can This Be Worked Around?

分配給欄位時保留引用

在 C# 中,不可能透過「引用」分配給類別欄位。這是因為欄位不能是引用類型。造成這種情況的主要原因有三:

限制原因:

  1. 不安全的引用欄位:允許引用欄位將打開可能性在程式碼中製造“定時炸彈”。假設您將 ref 欄位分配給局部變量,該變數在方法完成後可能會變得無效,從而導致潛在的崩潰。
  2. 暫存池: 局部變數通常儲存在暫存記憶體池中以最佳化效能。允許引用欄位將需要使用垃圾收集堆,這效率較低。

解決方法:

儘管有限制,但有一個解決方法可以模擬類似引用的行為:

使用委託與操作:

建立一個具有所需值的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
}

在這種情況下,x 儲存一個可以取得和設定 y 值的委託。當你設定 x.Value 時,它會修改 y.

以上是為什麼不能透過引用來分配 C# 類別字段,以及如何解決這個問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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