Heim >Backend-Entwicklung >C++ >Warum können C#-Klassenfelder nicht per Referenz zugewiesen werden und wie kann dies umgangen werden?

Warum können C#-Klassenfelder nicht per Referenz zugewiesen werden und wie kann dies umgangen werden?

DDD
DDDOriginal
2025-01-05 22:01:42364Durchsuche

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

Behalten von Referenzen beim Zuweisen zu einem Feld

In C# ist das Zuweisen per „Referenz“ zu einem Klassenfeld nicht möglich. Dies liegt daran, dass Felder nicht vom Referenztyp sein können. Dafür gibt es drei Hauptgründe:

Gründe für die Einschränkung:

  1. Unsichere Referenzfelder: Das Zulassen von Referenzfeldern würde die Möglichkeit eröffnen der Schaffung von „Zeitbomben“ im Code. Angenommen, Sie weisen einer lokalen Variablen ein Ref-Feld zu, das nach Abschluss der Methode möglicherweise ungültig wird, was zu möglichen Abstürzen führen kann.
  2. Temporärer Speicherpool: Lokale Variablen werden normalerweise in einem temporären Speicherpool gespeichert um die Leistung zu optimieren. Das Zulassen von Ref-Feldern würde die Verwendung des Garbage-Collected-Heaps erfordern, der weniger effizient ist.

Problemumgehung:

Trotz der Einschränkung gibt es eine zu simulierende Problemumgehung Referenzähnliches Verhalten:

Verwendung eines Delegaten und Aktion:

Erstellen Sie einen Delegaten mit einem Getter und Setter für den gewünschten Wert. Speichern Sie diesen Delegaten in einem Feld statt in einer Referenz. Zum Beispiel:

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
}

In diesem Fall speichert x einen Delegaten, der den Wert von y abrufen und festlegen kann. Wenn Sie x.Value festlegen, ändert es y.

Das obige ist der detaillierte Inhalt vonWarum können C#-Klassenfelder nicht per Referenz zugewiesen werden und wie kann dies umgangen werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn