在 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中文網其他相關文章!