首頁 >後端開發 >C++ >為什麼 C# 不允許欄位保存引用,有哪些替代方案?

為什麼 C# 不允許欄位保存引用,有哪些替代方案?

DDD
DDD原創
2025-01-06 03:12:39711瀏覽

Why Doesn't C# Allow Fields to Hold References, and What Are the Alternatives?

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更新)(由Z更新)”,但只列印“X(由Y更新)”。出現此行為的原因是為欄位指派「ref 參數」會遺失引用。

為什麼欄位不能保存引用?

只有三種可能的選項考慮「ref 類型」欄位:

  1. 禁止 ref 欄位類型:這是 C# 中的當前行為。
  2. 允許引用類型的不安全欄位:這將允許存取不安全記憶體的可能性,可能導致不可預測的行為。
  3. 將局部變數儲存在堆疊外:這會阻止將局部變數儲存在暫存記憶體池中的最佳化,即不可取。

選擇選項 1 是為了確保程式穩定性並防止在程式碼中建立定時炸彈。

如何實現類似引用的行為

雖然您不能擁有ref 類型的字段,但還有其他方法可以實現類似引用的效果行為:

  • 建立一個封裝引用的類別:您可以建立一個提供getter 和setter方法的類別來存取和修改引用的變數。這是引用另一個變數的間接方式。
  • 使用 C# 7 功能(Ref 局部變數和 Ref 返回方法): 雖然 C# 不支援在欄位中儲存引用,但它支援 ref 局部變數和 ref 返回方法。這允許您建立可以透過引用傳遞並透過多種方法修改的 ref 變數。

以上是為什麼 C# 不允許欄位保存引用,有哪些替代方案?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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