Heim >Backend-Entwicklung >C++ >Warum bleibt die Referenz in C# beim Zuweisen eines Referenzparameters zu einem Klassenfeld nicht erhalten?
Referenzierung von Klassenfeldern in C#
In C# ermöglicht die Übergabe eines Parameters als Referenz eine direkte Änderung der ursprünglichen Variablen. Beim Zuweisen eines Referenzparameters zu einem Klassenfeld tritt jedoch möglicherweise nicht das erwartete Verhalten auf.
Beachten Sie den folgenden Code:
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();
Bei der Ausführung lautet die Ausgabe „X (Aktualisiert von). Y)“, nicht „X (Updated By Y) (Updated By Z)“, wie erwartet.
Dies liegt daran, dass das Zuweisen eines Referenzparameters zu einem Klassenfeld die Funktion unterbricht Referenz. Um die Referenz aufrechtzuerhalten, besteht eine Lösung darin, einen Getter und Setter zu verwenden:
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. }
In diesem Beispiel ist „x“ ein Objekt, das den Wert von „y“ abrufen und festlegen kann und dabei die Referenz dazwischen aufrechterhält ihnen. Beachten Sie, dass Ref-Locals und Ref-Returning-Methoden zwar in der CLR unterstützt werden, in C# jedoch noch nicht verfügbar sind.
Das obige ist der detaillierte Inhalt vonWarum bleibt die Referenz in C# beim Zuweisen eines Referenzparameters zu einem Klassenfeld nicht erhalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!