Heim > Backend-Entwicklung > C++ > Warum lässt C# nicht zu, dass Felder Referenzen enthalten, und welche Alternativen gibt es?

Warum lässt C# nicht zu, dass Felder Referenzen enthalten, und welche Alternativen gibt es?

DDD
Freigeben: 2025-01-06 03:12:39
Original
677 Leute haben es durchsucht

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

Referenzzuweisungen in C#-Klassenfeldern

In C# kann der Versuch, eine Zuweisung per „Referenz“ auf ein Klassenfeld vorzunehmen, zu unerwartetem Verhalten führen. Betrachten 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();
Nach dem Login kopieren

Die erwartete Ausgabe ist „X (Updated By Y) (Updated By Z)“, aber stattdessen wird nur „X (Updated By Y)“ gedruckt. Dieses Verhalten tritt auf, weil beim Zuweisen eines „Ref-Parameters“ zu einem Feld die Referenz verloren geht.

Warum können Felder keine Referenzen enthalten?

Es gibt nur drei mögliche Optionen, wenn Berücksichtigung von Feldern vom Typ „Ref“:

  1. Felder vom Typ „Ref“ nicht zulassen: Dies ist das aktuelle Verhalten in C#.
  2. Unsichere Felder vom Ref-Typ zulassen: Dies würde die Möglichkeit des Zugriffs auf unsicheren Speicher ermöglichen, was möglicherweise zu unvorhersehbarem Verhalten führen würde.
  3. Speichern Sie lokale Variablen außerhalb des Stapels: Dies würde die Optimierung der Speicherung lokaler Variablen in einem temporären Speicherpool verhindern, was nicht der Fall ist wünschenswert.

Option 1 wurde gewählt, um die Programmstabilität sicherzustellen und die Entstehung von Zeitbomben im Code zu verhindern.

So erreichen Sie referenzähnliches Verhalten

Während Sie keine Felder vom Typ „ref“ haben können, gibt es alternative Möglichkeiten, referenzähnliche Felder zu erreichen Verhalten:

  • Erstellen einer Klasse, die die Referenz kapselt: Sie können eine Klasse erstellen, die Getter- und Setter-Methoden bereitstellt, um auf die referenzierte Variable zuzugreifen und diese zu ändern. Dies ist eine indirekte Möglichkeit, auf eine andere Variable zu verweisen.
  • Verwendung von C# 7-Funktionen (Ref Locals und Ref Returning Methods): Obwohl C# das Speichern von Referenzen in Feldern nicht unterstützt, unterstützt es Ref Locals und Ref-Rückgabemethoden. Dadurch können Sie Ref-Variablen erstellen, die als Referenz übergeben und mit mehreren Methoden geändert werden können.

Das obige ist der detaillierte Inhalt vonWarum lässt C# nicht zu, dass Felder Referenzen enthalten, und welche Alternativen gibt es?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage